12.3. ¸í½ÃÀû ¶ô

PostgreSQL´Â Å×ÀÌºí ³», µ¥ÀÌÅÍ¿¡ ´ëÇÑ µ¿½Ã Á¢±ÙÀ» Á¦¾îÇϱâ À§Çؼ­ ¿©·¯°¡Áö Á¾·ùÀÇ ¶ô ¸ðµå¸¦ °®Ãß°í ÀÖ½À´Ï´Ù. MVCC¿¡¼­ ÇÊ¿äÇÑ µ¿ÀÛÀ» ¾òÀ» ¼ö ¾ø´Â °æ¿ì, ÀÌ·¯ÇÑ ¸ðµå¸¦ ¾îÇø®ÄÉÀÌ¼Ç Á¦¾î ¶ô¿¡ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¶ÇÇÑ, ´ëºÎºÐÀÇ PostgreSQLÄ¿¸àµå´Â ÂüÁ¶µÈ Å×À̺íÀÌ Ä¿¸àµåÀÇ ½ÇÇà Áß¿¡ ´Ù¸¥ ¹æ¹ýÀ¸·Î »èÁ¦³ª º¯°æµÇÁö ¾Ê¾Ò´Ù´Â °ÍÀ» È®½ÇÈ÷ Çϱâ À§Çؼ­, ÀûÀýÇÑ ¸ðµåÀÇ ¶ôÀ» ÀÚµ¿À¸·Î ¾ò½À´Ï´Ù. (¿¹¸¦ µé¾î, ALTER TABLEÄ¿¸àµå´Â °°Àº Å×À̺íÀÇ ´Ù¸¥ ¿¬»ê°ú µ¿½Ã¿¡ ½ÇÇàÇÏ´Â °ÍÀº À§ÇèÇÕ´Ï´Ù. ÀÌ·Î ÀÎÇØ, Å×À̺íÀÇ ¹èŸ ¶ôÀ» °­Á¦·Î ȹµæÇÕ´Ï´Ù.).

ÇöÀç µ¥ÀÌÅͺ£À̽º ¼­¹ö¿¡¼­ Áß¿äÇÑ ¶ô ¸®½ºÆ®¸¦ È®ÀÎÇÏ·Á¸é, pg_locks ½Ã½ºÅÛ ºä¸¦ »ç¿ëÇØ Áֽʽÿä. ¶ô °ü¸® »óŸ¦ ¸ð´ÏÅ͸µÇÏ´Â °Í¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ »çÇ×Àº Chapter 25À» ÂüÁ¶ÇØ Áֽʽÿä.

12.3.1. Å×ÀÌºí ·¹º§ ¶ô

ÀÌÇÏÀÇ ¸®½ºÆ®´Â PostgreSQL¿¡¼­ ÀÚµ¿À¸·Î »ç¿ëµÇ´Â ÀÌ¿ë °¡´ÉÇÑ ¶ô ¸ðµå¿Í ±× ¹®¸ÆÀ» ³ªÅ¸³À´Ï´Ù. ¶ÇÇÑ, LOCK Ä¿¸àµå¸¦ »ç¿ëÇØ, ÀÌ·¯ÇÑ ¶ôÀ» ¸í½ÃÀûÀ¸·Î ȹµæÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ ¶ô ¸ðµå´Â, ºñ·Ï À̸§¿¡ "row(Çà)"¶ó´Â ¸»ÀÌ ºÙ¾î À־, ¸ðµÎ Å×ÀÌºí ·¹º§ÀÇ ¶ôÀ̶ó´Â °ÍÀ» ÁÖÀÇÇØ Áֽʽÿä. ¶ô ¸ðµåÀÇ À̸§Àº ¿ª»çÀûÀÎ °ÍÀÔ´Ï´Ù. ÀÌ·¯ÇÑ À̸§Àº, °¢°¢ÀÇ ¶ô ¸ðµåÀÇ ´ëÇ¥ÀûÀÎ »ç¿ë¹ýÀ» ÀϺΠ³ªÅ¸³»°í ÀÖ½À´Ï´Ù. ±×·¯³ª ÀǹÌÀûÀ¸·Î´Â ¸ðµÎ °°½À´Ï´Ù. ¶ô ¸ðµå °£ÀÇ À¯ÀÏÇÑ ½ÇÁúÀûÀÎ Â÷ÀÌ´Â, ¾î´À ¸ðµå³¢¸® Ãæµ¹Çϴ°¡ ÇÏ´Â ¶ô ¸ðµåÀÇ ¸¶ÂûÀÔ´Ï´Ù. µÎ °³ÀÇ Æ®·£Àè¼ÇÀº µ¿½Ã¿¡ °°Àº Å×ÀÌºí »ó¿¡¼­ Ãæµ¹ÇÏ´Â ¶ôÀ» °¡Áú ¼ö ¾ø½À´Ï´Ù. (±×·¯³ª Æ®·£Àè¼ÇÀº ÀÚ±â ÀڽŰú´Â °áÄÚ Ãæµ¹ÇÏÁö ¾Ê½À´Ï´Ù. ¿¹¸¦ µé¾î, ACCESS EXCLUSIVE¶ôÀ» ȹµæÇØ, ±× ÈÄ °°Àº Å×ÀÌºí¿¡ACCESS SHARE¶ôÀ» ȹµæÇÒ ¼ö ÀÖÀ» °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù). Ãæµ¹ÇÏÁö ¾Ê´Â ¶ô ¸ðµå´Â µ¿½Ã¿¡ ¸¹Àº Æ®·£Àè¼ÇÀ» °¡Áú ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷, ¶ô ¸ðµå¿¡´Â ÀÚ±â Ãæµ¹ÇÏ´Â °Í(¿¹¸¦ µé¸é, ACCESS EXCLUSIVE ¶ôÀº µ¿½Ã¿¡ ´Ù¼öÀÇ Æ®·£Àè¼Ç¿¡¼­ °¡Áú ¼ö ¾øÀ½)°ú ÀÚ±â Ãæµ¹ÇÏÁö ¾Ê´Â °Í(¿¹¸¦ µé¸é, ACCESS SHARE ¶ôÀº º¹¼öÀÇ Æ®·£Àè¼Ç¿¡¼­ °¡Áú ¼ö ÀÖÀ½)ÀÌ ÀÖ´Â °ÍÀ» ÁÖÀÇÇØ Áֽʽÿä.

Å×ÀÌºí ·¹º§ ¶ô ¸ðµå

ACCESS SHARE

¿ÀÁ÷ ACCESS EXCLUSIVE¶ô ¸ðµå¿Í Ãæµ¹ÇÕ´Ï´Ù.

SELECTÄ¿¸àµå´Â ÂüÁ¶µÈ Å×À̺íÀÇ ÀÌ ¸ðµå¿¡ ´ëÇÑ ¶ôÀ» ¾ò½À´Ï´Ù. º¸Åë, Å×À̺íÀ» Àд °Í¸¸À¸·Î º¯°æÀ» ½ÇÇàÇÏÁö ¾Ê´Â Äõ¸®ÀÇ °æ¿ì, ¸ðµÎ ÀÌ ¶ô ¸ðµå¸¦ °®½À´Ï´Ù.

ROW SHARE

EXCLUSIVE ¹× ACCESS EXCLUSIVE¶ô ¸ðµå¿Í Ãæµ¹ÇÕ´Ï´Ù.

SELECT FOR UPDATE ¹× SELECT FOR SHAREÄ¿¸àµå´Â (ÂüÁ¶µÇÁö¸¸ FOR UPDATE/FOR SHAREÀ» ¼±ÅÃÇÏÁö ¾ÊÀº ´Ù¸¥ Å×ÀÌºí¿¡ ´ëÇØ ACCESS SHARE¶ô¿¡ Ãß°¡µÊ) ¸ñÇ¥ Å×ÀÌºí¿¡¼­ ÀÌ ¸ðµåÀÇ ¶ôÀ» ¾ò½À´Ï´Ù.

ROW EXCLUSIVE

SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ¹× ACCESS EXCLUSIVE¶ô ¸ðµå¿Í Ãæµ¹ÇÕ´Ï´Ù.

UPDATE, DELETE, ¹× INSERTÄ¿¸àµå´Â (ÂüÁ¶µÇ´Â ´Ù¸¥ ¸ðµç Å×ÀÌºí¿¡ ´ëÇÑ ACCESS SHARE¶ô¿¡ °¡¼¼ÇØ) ¸ñÇ¥ Å×ÀÌºí¿¡¼­ ÀÌ ¸ðµåÀÇ ¶ôÀ» ȹµæÇÕ´Ï´Ù. º¸Åë, ÀÌ ¶ô ¸ðµå´Â Å×À̺íÀÇ µ¥ÀÌÅ͸¦ º¯°æÇÏ´Â Äõ¸®¿¡ ÀÇÇØ ȹµæµË´Ï´Ù.

SHARE UPDATE EXCLUSIVE

SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ¹× ACCESS EXCLUSIVE¶ô ¸ðµå¿Í Ãæµ¹ÇÕ´Ï´Ù. ÀÌ ¸ðµå¿¡ ÀÇÇØ µ¿½Ã ½ÇÇàµÇ´Â ½ºÅ°¸¶ÀÇ º¯°æ ¹× VACUUMÄ¿¸àµåÀÇ ½ÇÇàÀ¸·ÎºÎÅÍ Å×À̺íÀ» º¸È£ÇÕ´Ï´Ù.

(FULL ¾øÀÌ)VACUUMÄ¿¸àµå, ANALYZEÄ¿¸àµå, ¹× CREATE INDEX CONCURRENTLY¿¡ ÀÇÇØ ȹµæµË´Ï´Ù.

SHARE

ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ¹× ACCESS EXCLUSIVE¶ô ¸ðµå¿Í Ãæµ¹ÇÕ´Ï´Ù. ÀÌ ¸ðµå¿¡ ÀÇÇØ, µ¿½Ã¿¡ ÁøÇàµÇ´Â µ¥ÀÌÅÍ º¯°æÀ¸·ÎºÎÅÍ Å×À̺íÀ» º¸È£ÇÕ´Ï´Ù.

(CONCURRENTLY¾øÀÌ)CREATE INDEX¿¡ ÀÇÇØ ȹµæµË´Ï´Ù.

SHARE ROW EXCLUSIVE

ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ¹× ACCESS EXCLUSIVE¶ô ¸ðµå¿Í Ãæµ¹ÇÕ´Ï´Ù.

ÀÌ ¶ô ¸ðµå¸¦ ÀÚµ¿À¸·Î ȹµæÇÏ´ÂPostgreSQLÄ¿¸àµå´Â ¾ø½À´Ï´Ù.

EXCLUSIVE

ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ¹× ACCESS EXCLUSIVE¶ô ¸ðµå¿Í Ãæµ¹ÇÕ´Ï´Ù. ÀÌ ¸ðµå, µ¿½Ã ½ÇÇàµÇ´Â ACCESS SHARE¸¸À» Çã°¡ÇÕ´Ï´Ù. Áï, ÀÌ ¶ô ¸ðµå¸¦ °¡Áö´Â Æ®·£Àè¼Ç°ú º´ÇàÇØ¼­ ½ÇÇàÇÒ ¼ö Àִ ó¸®´Â Å×À̺íÀÇ read »ÓÀÔ´Ï´Ù.

À¯Àú Å×ÀÌºí¿¡ ´ëÇØ ÀÌ ¶ô ¸ðµå¸¦ ÀÚµ¿À¸·Î ȹµæÇÏ´ÂPostgreSQLÄ¿¸àµå´Â ¾ø½À´Ï´Ù. ±×·¯³ª ÀÌ´Â ÀϺΠ¿¬»ê ³», ƯÁ¤ ½Ã½ºÅÛ Ä«Å»·Î±×¿¡¼­ ȹµæµË´Ï´Ù.

ACCESS EXCLUSIVE

¸ðµç ¶ô ¸ðµå(ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ¹× ACCESS EXCLUSIVE)¿Í Ãæµ¹ÇÕ´Ï´Ù. ÀÌ ¸ðµå¿¡ ÀÇÇØ, ±× º¸°ü À¯ÁöÀÚ À̿ܿ¡ Å×ÀÌºí¿¡ Á¢±ÙÇÏ´Â Æ®·£Àè¼ÇÀÌ ¾ø´Ù´Â °ÍÀÌ º¸ÁõµË´Ï´Ù.

ALTER TABLE, DROP TABLE, TRUNCATE, REINDEX, CLUSTER ¹× VACUUM FULLÄ¿¸àµå¿¡ ÀÇÇØ ȹµæµË´Ï´Ù. ¶ÇÇÑ, ¸í½ÃÀûÀ¸·Î ¸ðµå¸¦ ÁöÁ¤ÇÏÁö ¾ÊÀ¸¸é, À̰ÍÀÌ LOCK TABLE¹®À» »ç¿ëÇÒ ¶§ÀÇ µðÆúÆ® ¶ô ¸ðµåÀÔ´Ï´Ù.

Tip: ACCESS EXCLUSIVE¶ô¸¸ÀÌ, SELECT(FOR UPDATE/SHARE¾øÀ½) ¹®À» Â÷´ÜÇÕ´Ï´Ù.

º¸Åë ¶ôÀº Çѹø ȹµæÇϸé, Æ®·£Àè¼ÇÀÇ ¸¶Áö¸·±îÁö ¼ÒÀ¯µË´Ï´Ù. ±×·¯³ª ¶ôÀÌ ¼¼ÀÌºê Æ÷ÀÎÆ®ÀÇ È®¸³ ÈÄ¿¡ ȹµæµÆÀ» °æ¿ì, ¼¼ÀÌºê Æ÷ÀÎÆ®°¡ ·Ñ¹é(rollback)µÇ¸é, ¶ôÀº Áï¼®¿¡¼­ ÇØÁ¦µË´Ï´Ù. À̰ÍÀº, ROLLBACK°¡ ¼¼ÀÌºê Æ÷ÀÎÆ® ÀÌÈÄ¿¡ ÇàÇØÁø ¸ðµç Ä¿¸àµåÀÇ È¿°ú¸¦ Ãë¼ÒÇÑ´Ù´Â ¿øÄ¢°ú Àϰü¼ºÀ» °¡Áý´Ï´Ù. PL/pgSQL¿¹¿Ü ºí·Ï ³»¿¡¼­ ȹµæµÈ ¶ô¿¡ ´ëÇØ¼­µµ ¸¶Âù°¡Áý´Ï´Ù ±× ºí·ÏÀ¸·ÎºÎÅÍ ¿¡·¯·Î ºüÁø ÈÄ, ȹµæµÈ ¶ôÀº ÇØÁ¦µË´Ï´Ù.

12.3.2. Çà ·¹º§ ¶ô

Å×ÀÌºí ·¹º§ ¶ô¿¡ °¡¼¼ÇØ, ¹èŸ ¶ô ¶Ç´Â °øÀ¯ ¶ôÀ» ½Ç½ÃÇÒ ¼ö ÀÖ´Â, Çà ·¹º§ ¶ôÀÌ ÀÖ½À´Ï´Ù. ƯÁ¤ Çà¿¡ ´ëÇÑ Çà ·¹º§ÀÇ ¹èŸ ¶ôÀº, ÇàÀÌ °»½Å ¶Ç´Â »èÁ¦µÉ ¶§ ÀÚµ¿À¸·Î ȹµæµË´Ï´Ù. Æ®·£Àè¼ÇÀÌ Ã³¸® ¶Ç´Â ·Ñ¹é(rollback) µÉ ¶§±îÁö, Å×ÀÌºí ·¹º§ ¶ô°ú °°ÀÌ, ¶ôÀº ¼ÒÀ¯µÇ¾îÁý´Ï´Ù. Çà ·¹º§ ¶ôÀº µ¥ÀÌÅÍ Äõ¸®¿¡´Â ¿µÇâÀ» ÁÖÁö ¾Ê½À´Ï´Ù. Çà ·¹º§ ¶ôÀº °°Àº Çà¿¡ ´ëÇÑ ÀÔ·Â ¸¸À» Â÷´ÜÇÕ´Ï´Ù.

½ÇÁ¦·Î ÇàÀ» º¯°æÇÏÁö ¾Ê°í Çà¿¡ ´ëÇØ Çà ·¹º§ ¶ôÀ» ȹµæÇÏ·Á¸é, ÇØ´çÇÏ´Â ÇàÀ» SELECT FOR UPDATE·Î ¼±ÅÃÇØ Áֽʽÿä. ÀÏ´Ü Çà ·¹º§ ¶ôÀÌ È¹µæµÇ¸é, Ãæµ¹¿¡ ´ëÇÑ °ÆÁ¤¾øÀÌ, Æ®·£Àè¼ÇÀº ¿©·¯ ¹øÀÇ Çà º¯°æÀÌ °¡´ÉÇÏ´Ù´Â °ÍÀ» ÁÖÀÇÇϽʽÿä.

¾î´À Çà¿¡ ´ëÇÑ °øÀ¯µÈ Çà ·¹º§ ¶ôÀ» ȹµæÇÏ·Á¸é, SELECT FOR SHARE¸¦ »ç¿ëÇØ ÇØ´çµÇ´Â ÇàÀ» ¼±ÅÃÇØ Áֽʽÿä. °øÀ¯ ¶ôÀº, ´Ù¸¥ Æ®·£Àè¼Ç¿¡ ÀÇÇÑ °°Àº °øÀ¯ ¶ôÀÇ È¹µæÀ» ¹æÇØÇÏÁö ¾Ê½À´Ï´Ù. ±×·¯³ª ´Ù¸¥ Æ®·£Àè¼ÇÀÌ °øÀ¯ ¶ôÀ» °¡Áø Çà¿¡ ´ëÇØ¼­, °»½Å, »èÁ¦, ¹èŸ ¶ôÀÇ È¹µæÀ» ½ÇÇàÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â Æ®·£Àè¼ÇÀº ¾ø½À´Ï´Ù. À̰ÍÀ» ½ÃÇèÇϸé, °øÀ¯ ¶ôÀÌ ÇØÁ¦µÉ ¶§±îÁö Â÷´ÜµË´Ï´Ù.

PostgreSQL¿¡¼­´Â, ¸Þ¸ð¸®»ó¿¡¼­ º¯°æµÈ ÇàÀÇ Á¤º¸¸¦ ±â¾ïÇÏÁö ¾ÊÀ¸¹Ç·Î, µ¿½Ã¿¡ Àá±Û ¼ö ÀÖ´Â Çà ¼öÀÇ »óÇÑÀº ¾ø½À´Ï´Ù. ±×·¯³ª ÇàÀ» Àá±Û ¶§, µð½ºÅ©¿¡ ÀÔ·ÂÇÏ´Â ÀÛ¾÷ÀÌ ¹ß»ýÇÒÁöµµ ¸ð¸¨´Ï´Ù. µû¶ó¼­, ¿¹¸¦ µé¸éSELECT FOR UPDATE´Â ¼±ÅÃµÈ ÇàÀÌ ¶ôµÈ °ÍÀ» Ç¥½ÃÇϱâ À§ÇØ º¯°æÇÏ°í µð½ºÅ©¿¡ °á°ú¸¦ ÀÔ·ÂÇÕ´Ï´Ù.

Å×À̺í°ú Çà ¶ô¿¡ °¡¼¼ÇØ ÆäÀÌÁö ·¹º§ÀÇ °øÀ¯/¹èŸ ¶ôÀÌ ÀÖÀ¸¸ç, À̵éÀº °øÀ¯ ¹öÆÛ Ç®¿¡ ÀÖ´Â Å×ÀÌºí ÆäÀÌÁöÀÇ ÀÐ°í ¾²±â ¾×¼¼½º¸¦ °ü¸®Çϱâ À§Çؼ­ »ç¿ëµË´Ï´Ù. ÀÌ·¯ÇÑ ¶ôÀº ÇàÀÌ ÃëµæµÈ Èijª °»½ÅµÈ ÈÄ Áï½Ã ÇØÁ¦µË´Ï´Ù. ¾îÇø®ÄÉÀÌ¼Ç °³¹ßÀÚ´Â º¸Åë ÆäÀÌÁö ·¹º§ ¶ôÀ» °í·ÁÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù. ¶ô¿¡ ´ëÇØ ¿Ïº®ÇÏ°Ô ¼³¸íÇÏ°í ½Í¾î ÆäÀÌÁö ·¹º§ ¶ôÀ» ¼³¸íÇß½À´Ï´Ù.

12.3.3. µ¥µå ¶ô(±³Âø»óÅÂ)

¸í½ÃÀû ¶ôÀÇ »ç¿ëÀº µ¥µå ¶ôÀÇ ¿øÀÎÀÌ µÉ °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù. µ¥µå ¶ôÀ̶õ, 2°³(ȤÀº ±× ÀÌ»ó)ÀÇ Æ®·£Àè¼Ç¿¡¼­, °¢°¢ÀÇ Æ®·£Àè¼ÇÀÌ ÇÊ¿ä·Î ÇÏ´Â ¶ôÀ» ¼ÒÀ¯ÇØ ¹ö¸®´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¸é, Æ®·£Àè¼Ç 1ÀÌ Å×À̺í A¿¡ ¹èŸ ¶ôÀ» ȹµæÇϰí ÀÖ°í, ±×·± ´ÙÀ½¿¡ Å×À̺í B°¡ ¹èŸ ¶ôÀ» ȹµæÇϰųª ¹Ý¸é¿¡, Æ®·£Àè¼Ç 2°¡ ÀÌ¹Ì Å×À̺í B¿¡ ¹èŸ ¶ôÀ» ȹµæÀÌ ³¡³­ »óÅÂÀ̸ç, Áö±ÝºÎÅÍ Å×À̺í A¿¡ ¹èŸ ¶ôÀ» ¿øÇϸé, ¾î´À ÂÊÀÇ Æ®·£Àè¼Çµµ 󸮵ÇÁö ¾Ê½À´Ï´Ù. PostgreSQL¿¡¼­´Â ÀÚµ¿À¸·Î µ¥µå ¶ô »óȲÀ» °¨ÁöÇØ, °ü°èÇÏ´Â Æ®·£Àè¼ÇÀÇ Çϳª¸¦ Áß´Ü(abort)½ÃŰ´Â °ÍÀ¸·Î »óȲÀ» ÇØ°áÇÏ°í ´Ù¸¥ ÇϳªÀÇ Æ®·£Àè¼Ç 󸮸¦ ¿Ï·á½Ãŵ´Ï´Ù (¾î´À Æ®·£Àè¼ÇÀ» Áß´Ü(abort)Çұ Á¤È®ÇÏ°Ô ¿¹ÃøÇϱâ´Â Èûµé¸ç, ÀÌ¿¡ ÀÇÁ¸ÇØÁö ¸»¾Æ¾ßÇÕ´Ï´Ù.).

µ¥µå ¶ôÀº Çà ·¹º§ ¶ôÀÇ °á°ú·Î¼­ ¹ß»ýÇÒ °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù (µû¶ó¼­, ¸í½ÃÀû ¶ô 󸮸¦ »ç¿ëÇÏÁö ¾Ê¾Æµµ ¹ß»ýÇÒ °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù). 2°³ µ¿½Ã Æ®·£Àè¼ÇÀÌ ÀÖ´Â Å×À̺íÀ» º¯°æÇÏ´Â »óȲÀ» »ý°¢ÇØ º¸°Ú½À´Ï´Ù. 1 ¹øÂ° Æ®·£Àè¼ÇÀº ÀÌÇϸ¦ ½ÇÇàÇÕ´Ï´Ù.

UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 11111;

ÀÌ´Â ÁöÁ¤ÇÑ °èÁ ¹øÈ£ÀÇ Çà¿¡ ´ëÇØ, Çà ·¹º§ ¶ôÀ» ȹµæÇÕ´Ï´Ù. ´ÙÀ½À¸·Î 2¹øÂ° Æ®·£Àè¼ÇÀÌ ÀÌÇϸ¦ ½ÇÇàÇÕ´Ï´Ù.

UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 22222;
UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 11111;

1¹øÂ° UPDATE¹®Àº ÁöÁ¤µÈ Çà¿¡ ´ëÇØ Çà ·¹º§ ¶ôÀÇ È¹µæ¿¡ ¼º°øÇϰí, ÇàÀÇ °»½Åµµ ¼º°øÇÕ´Ï´Ù. ±×·¯³ª 2¹øÂ° UPDATE¹®Àº °»½Å ´ë»óÀÇ ÇàÀÌ ¶ôµÈ °ÍÀ» ¹ß°ßÇϰí, ¶ôÀ» ȹµæÇÑ Æ®·£Àè¼ÇÀÌ ¿Ï·áÇÒ ¶§±îÁö ´ë±âÇÕ´Ï´Ù. Æ®·£Àè¼Ç 2´Â °è¼ÓÇØ¼­ ½ÇÇàÇϱâ Àü¿¡ Æ®·£Àè¼Ç 1ÀÌ ¿Ï·áÇÏ±æ ±â´ëÇϰí ÀÖ½À´Ï´Ù. ±×·±µ¥ Æ®·£Àè¼Ç 1ÀÌ ¿©±â¼­ ÀÌÇϸ¦ ½ÇÇàÇÕ´Ï´Ù.

UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 22222;

Æ®·£Àè¼Ç 1Àº ÁöÁ¤ÇÑ ÇàÀÇ Çà ·¹º§ ¶ôÀ» ȹµæÇÏ·Á°í ÇÏÁö¸¸, ºÒ°¡´ÉÇÕ´Ï´Ù. Æ®·£Àè¼Ç 2°¡ ¶ôÀ» ÀÌ¹Ì È¹µæÇϰí Àֱ⠶§¹®ÀÔ´Ï´Ù. ±× ¶§¹®¿¡ Æ®·£Àè¼Ç 2°¡ ¿Ï·áÇÒ ¶§±îÁö ´ë±âÇÕ´Ï´Ù. ÀÌ·¸°Ô Æ®·£Àè¼Ç 1Àº Æ®·£Àè¼Ç 2·Î Â÷´ÜµÇ°í Æ®·£Àè¼Ç 2´Â Æ®·£Àè¼Ç 1¿¡ Â÷´ÜµÇ´Â µ¥µå ¶ô »óÅÂÀÔ´Ï´Ù. PostgreSQL´Â µ¥µå ¶ô »óŸ¦ ¹ß°ßÇÏ°í ´Ù¸¥ ÇÑÂÊÀÇ Æ®·£Àè¼ÇÀ» ÁߴܽÃŵ´Ï´Ù.

µ¥µå ¶ôÀ» ¸·´Â °¡Àå ÁÁÀº ¹æ¹ýÀº, µ¥ÀÌÅͺ£À̽º¸¦ »ç¿ëÇÏ´Â ¸ðµç ¾îÇø®ÄÉÀ̼ÇÀÌ, ÀϰüµÈ ¼ø¼­·Î º¹¼öÀÇ ¿ÀºêÁ§Æ®¿¡ ´ëÇÑ ¶ôÀ» ȹµæÇÏ´Â °ÍÀÔ´Ï´Ù. Àü¿¡ ³ªÅ¸³½ µ¥µå ¶ôÀÇ ¿¹·Î, ¾çÂÊ ¸ðµÎÀÇ Æ®·£Àè¼ÇÀÌ °°Àº ¼ø¼­·Î ÇàÀ» °»½ÅÇÑ´Ù¸é, µ¥µå ¶ôÀº ÀϾÁö ¾Ê½À´Ï´Ù. ¶ÇÇÑ, Æ®·£Àè¼Ç ³»ÀÇ ¿ÀºêÁ§Æ®¿¡ ȹµæµÇ¾îÁø ÃÖÃÊÀÇ ¶ôÀº ¿ÀºêÁ§Æ®°¡ ÇÊ¿ä·Î ÇÏ´Â ÃÖ»óÀÇ ¸ðµå¶ó´Â °ÍÀ» È®½ÇÈ÷ º¸ÁõÇØ¾ß ÇÕ´Ï´Ù. À̰ÍÀ» »çÀü¿¡ °ËÁõÇÒ ¼ö ¾øÀ» ¶§, µ¥µå ¶ôÀ¸·Î Áß´Ü(abort)µÈ Æ®·£Àè¼ÇÀ» Àç½ÇÇàÇϸé, µ¥µå ¶ôÀº µ¥ÀÌÅͺ£À̽º¸¦ °¡µ¿½ÃÄѵµ 󸮵Ǿî Áý´Ï´Ù.

µ¥µå ¶ô »óȲÀÌ ¹ß°ßµÇÁö ¾ÊÀ¸¸é, Å×ÀÌºí ·¹º§ ¶ôÀ̳ª Çà ·¹º§ ¶ôÀ» ¿ä±¸ÇÏ´Â Æ®·£Àè¼ÇÀº Ãæµ¹ÇÏ´Â ¶ôÀÌ ÇØÁ¦µÉ ¶§±îÁö, ¹«ÇÑÁ¤ ´ë±âÇÕ´Ï´Ù. µû¶ó¼­, ¾îÇø®ÄÉÀ̼ǿ¡¼­ Àå½Ã°£(¿¹¸¦ µé¸é, À¯ÀúÀÇ ÀÔ·Â ´ë±â) Æ®·£Àè¼ÇÀ» ¿¬ ä·Î À¯ÁöÇÏ´Â °ÍÀº ÃßõµÇÁö ¾Ê½À´Ï´Ù.

12.3.4. ±Ç°íÀû ¶ô

PostgreSQL´Â ¾îÇø®ÄÉÀ̼ǿ¡¼­ °³º°Àû Àǹ̸¦ °¡Áö´Â ¶ôÀ» »ý¼ºÇÏ´Â ¹æ¹ýÀ» Á¦°øÇÕ´Ï´Ù. ÀÌ´Â ±Ç°íÀû ¶ôÀ¸·Î ºÒ¸³´Ï´Ù. ¿Ö³ÄÇÏ¸é ½Ã½ºÅÛÀº ±×µéÀÇ »ç¿ëÀ» °­¿äÇÏÁö ¾Ê±â ¶§¹®ÀÔ´Ï´Ù. Áï, ¾îÇø®ÄÉÀ̼ÇÀÌ À̵éÀ» Á¤È®ÇÏ°Ô ¾²´Â °¡¿¡ ´Þ·ÁÀÖ½À´Ï´Ù. ±Ç°íÀû ¶ôÀº MVCC ¹æ½Ä¿¡ ¸ÂÃß±â Èûµç ¶ô Àü·«ÀÓ¿¡µµ, À¯¿ëÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ±Ç°íÀû ¶ôÀ» ȹµæÇÑ ÈÄ, ¸í½ÃÀûÀ¸·Î ÇØÁ¦µÇ¾î ¼¼¼ÇÀÌ ³¡³¯ ¶§±îÁö, ¶ôÀÌ ¼ÒÀ¯µÇ¾îÁý´Ï´Ù. Ç¥ÁØ ¶ô°ú ´Þ¸®, ±Ç°íÀû ¶ôÀº Æ®·£Àè¼Ç¿¡ Àǹ̸¦ ºÎ¿©ÇÏÁö ¾Ê½À´Ï´Ù. ¶ôÀÌ Æ®·£Àè¼Ç Áß¿¡ ȹµæµÇ¾î ´ÙÀ½¿¡ ·Ñ¹é(rollback)µÆ´Ù°í ÇØµµ, ·Ñ¹é(rollback) ÈÄ¿¡µµ ¼ÒÀ¯µÇ¾îÁý´Ï´Ù. ±×¸®°í È£ÃâÇÑ Æ®·£Àè¼ÇÀÌ ´ÙÀ½¿¡ ½ÇÆÐÇß´Ù°í ÇØµµ ¶ô ÇØÁ¦´Â À¯È¿ÇÕ´Ï´Ù. ¼ÒÀ¯ÇÏ´Â ÇÁ·Î¼¼½º¿¡¼­ µ¿ÀÏÇÑ ¶ôÀ» ¿©·¯ Â÷·Ê ȹµæÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ÀÌ °æ¿ì, °³°³ÀÇ ¶ô ¿ä±¸¿¡ ´ëÇØ¼­, ¶ôÀ» ½ÇÁ¦·Î ÇØÁ¦Çϱâ Àü¿¡ ´ëÀÀÇÏ´Â ¶ô ÇØÁ¦ ¿ä±¸°¡ ¾øÀ¸¸é ¾ÈµË´Ï´Ù. (ÀÌ¹Ì ¼¼¼ÇÀÌ ÁöÁ¤µÈ ¶ôÀ» ¼ÒÀ¯Çϰí ÀÖ´Â °æ¿ì, ´Ù¸¥ ¼¼¼ÇÀÌ ±× ¶ô ȹµæÀ» ´ë±âÇϰí ÀÖ¾ú´Ù°í ÇØµµ, Ãß°¡ÀÇ ¿ä±¸´Â Ç×»ó ¼º°øÇÕ´Ï´Ù. ) ¸ðµç PostgreSQLÀÇ ¶ô°ú °°ÀÌ, ÀÓÀÇÀÇ ¼¼¼ÇÀ¸·Î ÇöÀç º¸°ü À¯ÁöµÇ°í ÀÖ´Â ±Ç°íÀû ¶ôÀº ¸ðµÎ, pg_locks ½Ã½ºÅÛ ºä·Î ¿­°ÅµÇ°í ÀÖ½À´Ï´Ù.

±Ç°íÀû ¶ôÀº °øÀ¯ ¸Þ¸ð¸® Ç®ÀÇ ¿ÜºÎ¿¡ ÇÒ´çµÉ ¼ö ÀÖ¾î ±× ¿ë·®Àºmax_locks_per_transaction°úmax_connections¼³Á¤ º¯¼ö¿¡ ÀÇÇØ °áÁ¤µË´Ï´Ù. ÀÌ ¸Þ¸ð¸®°¡ ³¶ºñÇÏÁö ¾Êµµ·Ï ÁÖÀǰ¡ ÇÊ¿äÇÕ´Ï´Ù. ±×·¸Áö ¾ÊÀ¸¸é, ¼­¹ö´Â ¶ô ȹµæÀ» ÀüÇô Çã°¡ÇÒ ¼ö°¡ ¾ø°Ô µË´Ï´Ù. ÀÌ´Â ¼­¹ö·Î Çã°¡ÇÒ ¼ö ÀÖ´Â ±Ç°íÀû ¶ô ¼ö¿¡ »óÇÑÀÌ ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÕ´Ï´Ù. ¼­¹öÀÇ ¼³Á¤¿¡ µû¶ó ´Ù¸£Áö¸¸, º¸Åë 1¸¸¿¡¼­ 10¸¸ Á¤µµ°¡ µË´Ï´Ù.

ÀϹÝÀûÀÎ ±Ç°íÀû ¶ôÀÇ »ç¿ë ¹æ¹ýÀº, ÀÚÁÖ "Ç÷§ ÆÄÀÏ"µ¥ÀÌÅÍ °ü¸® ½Ã½ºÅÛÀ¸·Î ºÒ¸®´Â, ºñ°üÀûÀÎ ¶ô Àü·«À» À̹ķ¹ÀÌÆ®ÇÏ´Â °ÍÀÔ´Ï´Ù. °°Àº ¸ñÀûÀ» À§ÇØ Å×ÀÌºí ³»¿¡ Ç÷¡±×¸¦ ÀúÀåÇÒ ¼öµµ ÀÖÁö¸¸, ±Ç°íÀû ¶ôÀÌ ºü¸£°Ô MVCCÀÇ ÆØÃ¢À» ¸·À» ¼ö ÀÖ½À´Ï´Ù. ¶ÇÇÑ, ¼¼¼Ç Á¾·á½Ã¿¡ ¼­¹ö¿¡ ÀÇÇÑ ÀÚµ¿ Á¤¸®¸¦ ½Ç½ÃÇÒ ¼öµµ ÀÖ½À´Ï´Ù. SQL Ç¥Çö½ÄÀÇ Æò°¡ ¼ø¼­¶ó°í ÇÏ´Â Á¡À¸·ÎºÎÅÍ, ÀÌ ¹æ¹ýÀ» È®½ÇÈ÷ »ç¿ëÇÏ´Â »óȲ, ƯÈ÷ ¸í½ÃÀûÀÎ ¼ø¼­³ª LIMIT±¸¸¦ °¡Áö´Â Äõ¸®´Â ¶ô ȹµæÀ» ÁÖÀÇÇØ¼­ Á¦¾îÇϵµ·Ï ÇϽʽÿä. ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.

SELECT pg_advisory_lock(id) FROM foo WHERE id = 12345; -- ok
SELECT pg_advisory_lock(id) FROM foo WHERE id > 12345 LIMIT 100; -- danger!
SELECT pg_advisory_lock(q.id) FROM
(
  SELECT id FROM foo WHERE id > 12345 LIMIT 100;
) q; -- ok

À§ÀÇ ¿¹¿¡¼­´Â, ¶ô ȹµæ ÇÔ¼ö°¡ ½ÇÇàµÇ±â Àü¿¡LIMIT °¡ Àû¿ëµÈ´Ù´Â °ÍÀ» º¸ÀåÇÒ ¼ö ¾ø±â ¶§¹®¿¡, 2¹øÂ°ÀÇ Çü½ÄÀº À§ÇèÇÕ´Ï´Ù. ÀÌ·Î ÀÎÇØ, ¾îÇø®ÄÉÀ̼ÇÀÌ ¿¹»óµÇÁö ¾Ê´Â´Ù¶ó´Â ¿ä±¸·ÎºÎÅÍ ¶ôÀÌ »ý¼ºµÉ °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù. ±× ¶§¹®¿¡ (¼¼¼ÇÀÌ Á¾·áÇÒ ¶§±îÁö) ÇØÁ¦¿¡ ½ÇÆÐÇÏ°Ô µË´Ï´Ù. ¾îÇø®ÄÉÀ̼ÇÀÇ ºä¿¡¼­ º¸¸é, ÀÌ·¯ÇÑ ¶ôÀº ´Ü¼øÇÑ Àå½ÄÀÔ´Ï´Ù¸¸, pg_locks·ÎºÎÅÍ´Â °è¼Ó º¸¿©Áý´Ï´Ù.

±Ç°íÀû ¶ôÀ» Ãë±ÞÇϱâ À§ÇÑ ÇÔ¼ö¿¡ ´ëÇÑ »çÇ×Àº Table 9-50¿¡¼­ ¼³¸íÇÕ´Ï´Ù.