| PostgreSQL 8.3.3¹®¼ | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 12. µ¿½Ã¼º Á¦¾î | Fast Forward | Next |
Ç¥ÁØ SQL´Â Æ®·£Àè¼Ç °Ý¸®ÀÇ 4 ·¹º§À» µ¿½Ã¿¡ ½ÇÇàµÇ´Â Æ®·£Àè¼Çµé °£¿¡ ¹æÁöµÇ¾î¾ß ÇÒ 3°¡Áö Çö»óµéÀÇ °üÁ¡¿¡¼ Á¤ÀÇÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ¹Ù¶÷Á÷ÇÏÁö ¾ÊÀº Çö»óµéÀº ¾Æ·¡¿Í °°½À´Ï´Ù.
Æ®·£Àè¼ÇÀº µ¿½Ã¿¡ ½ÇÇàµÇ´Â 󸮵ÇÁö ¾ÊÀº Æ®·£Àè¼ÇÀ¸·ÎºÎÅÍ ÀÔ·ÂµÈ µ¥ÀÌÅ͸¦ ÀоîµéÀÔ´Ï´Ù.
Æ®·£Àè¼ÇÀº ÀÌÀü¿¡ ÀÐÈù µ¥ÀÌÅ͸¦ ÀçÀÐ¾î ´Ù¸¥ Æ®·£Àè¼Ç(ÃÖÃÊ·Î ÀÐÇôÁø ÈÄ·Î ¸Ã°ÜÁø)¿¡ ÀÇÇØ °»½ÅµÈ µ¥ÀÌÅ͸¦ ã¾Æ³½´Ù.
Æ®·£Àè¼ÇÀº °Ë»öÁ¶°ÇÀ» ¸¸Á·ÇÏ´Â º¹¼öÇàÀÌ µÇµ¹¾Æ¿À´Â Á¶È¸¸¦ Àç½ÇÇàÇÏ°í ±× Á¶°ÇÀ» ¸¸Á·½ÃŰ´Â º¹¼öÇàÀÌ ´Ù¸¥ ÃÖ±Ù¿¡ ¸Ã°ÜÁø Æ®·£Àè¼ÇÀ¸·Î ÀÎÇØ ¹Ù²î¾ú´Ù´Â°ÍÀ» ã¾Æ³À´Ï´Ù.
4°³ÀÇ Æ®·£Àè¼Ç °Ý¸® ·¹º§°ú ´ëÀÀÇÏ´Â µ¿ÀÛÀº Table 12-1¿¡ ¼³¸íµÇ¾î ÀÖ½À´Ï´Ù.
Table 12-1. SQLÆ®·£Àè¼Ç °Ý¸® ·¹º§
| °Ý¸® ·¹º§ | Dirty Read | Nonrepeatable Read | Phantom Read |
|---|---|---|---|
| 󸮵ÇÁö ¾ÊÀº Àбâ | °¡´É | °¡´É | °¡´É |
| Àбâ ó¸®µÊ | ºÒ°¡´É | °¡´É | °¡´É |
| Repeatable read | ºÒ°¡´É | ºÒ°¡´É | °¡´É |
| Á÷·ÄÈ | ºÒ°¡´É | ºÒ°¡´É | ºÒ°¡´É |
PostgreSQL¿¡¼´Â, 4°³ÀÇ Ç¥ÁØ Æ®·£Àè¼Ç °Ý¸® ·¹º§À» ¸ðµÎ ¿ä±¸ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¯³ª ³»ºÎÀûÀ¸·Î´Â, Read Committed¿Í Serializable¿¡ ´ëÀÀÇÏ´Â 2°³ÀÇ µ¶¸³ÇÑ °Ý¸® ·¹º§¸¸ÀÌ ÀÖ½À´Ï´Ù. Read Committed ·¹º§À» ¼±ÅÃÇßÀ» ¶§, ½ÇÁ¦·Î´Â Read Committed°¡ µÇ¾î, Repeatable Read¸¦ ¼±ÅÃÇßÀ» ¶§, ½ÇÁ¦·Î Á÷·ÄÈµÇ°Ô µË´Ï´Ù. ÀÌ¿Í °°ÀÌ ½ÇÁ¦ÀÇ °Ý¸® ·¹º§Àº ¼±ÅÃÇÑ ·¹º§º¸´Ù ¾ö¹ÐÇÏ°Ô µÇ´Â ÀÏÀÌ ÀÖ½À´Ï´Ù. À̰ÍÀº Ç¥ÁØ SQL¿¡¼µµ Çã°¡µÇ°í ÀÖ½À´Ï´Ù. ÀÌ 4°³ÀÇ °Ý¸® ·¹º§¿¡ ´ëÇØ¼´Â, ¹ß»ýÇØ¼´Â ¾È µÇ´Â Çö»ó¸¸ÀÌ Á¤ÀÇµÇ¾î ¹ß»ýÇØ¾ß ÇÏ´Â Çö»óÀº Á¤Àǵǰí ÀÖÁö ¾Ê½À´Ï´Ù. PostgreSQL°¡ 2°³ÀÇ °Ý¸® ·¹º§¸¸À» Á¦°øÇϰí ÀÖ´Â ÀÌÀ¯´Â, ´ÙÁß¹öÀü µ¿½Ã¼º Á¦¾î ±¸Á¶¿¡ Ç¥ÁØÀÇ °Ý¸® ·¹º§À» °ü·ÃÁþ´Â ½ÇÁ¦ÀûÀÎ ¹æ¹ýÀÌ ÀÌ°Í ¹Û¿¡ ¾ø±â ¶§¹®ÀÔ´Ï´Ù. ÀÌ¿ë °¡´ÉÇÑ °Ý¸® ·¹º§¿¡ ´ëÇØ¼´Â ´ÙÀ½¿¡ »ó¼¼ÇÏ°Ô ¼³¸íÇÕ´Ï´Ù.
Æ®·£Àè¼ÇÀÇ Æ®·£Àè¼Ç °Ý¸® ·¹º§À» ¼³Á¤ÇÏ·Á¸é SET TRANSACTION Ä¿¸àµå¸¦ »ç¿ëÇØ Áֽʽÿä.
PostgreSQL¿¡¼´Â Read Committed°¡ µðÆúÆ®ÀÇ °Ý¸® ·¹º§ÀÔ´Ï´Ù. Æ®·£Àè¼ÇÀÌ ÀÌ °Ý¸® ·¹º§·Î ½ÇÇàµÇ¸é, SELECTÄõ¸®´Â Äõ¸®°¡ ½ÇÇàµÇ±â Àü±îÁö ó¸®µÈ µ¥ÀÌÅ͸¸À» ÂüÁ¶ÇÕ´Ï´Ù. ¾ÆÁ÷ 󸮵ÇÁö ¾ÊÀº µ¥ÀÌÅͳª Äõ¸®ÀÇ ½ÇÇà Áß¿¡ µ¿½Ã Æ®·£Àè¼Ç¿¡ ÀÇÇØ ó¸®µÈ °»½ÅÀº ÂüÁ¶ÇÏÁö ¾Ê½À´Ï´Ù (±×·¯³ª SELECT¹®Àº ÀÚ±â ÀÚ½ÅÀÇ Æ®·£Àè¼Ç ³»¿¡¼ ½ÇÇàµÇ°í °»½ÅµÈ °á°ú´Â ºñ·Ï ¾ÆÁ÷ 󸮵ÇÁö ¾Ê¾Æµµ ÂüÁ¶ÇÕ´Ï´Ù). °á°úÀûÀ¸·Î, SELECTÄõ¸®´Â ±× Äõ¸®°¡ ½ÇÇàÀ» °³½ÃÇÑ ½ÃÁ¡ÀÇ µ¥ÀÌÅͺ£À̽ºÀÇ snapshotÀ» ÂüÁ¶ÇÏ°Ô µË´Ï´Ù. ÇϳªÀÇ Æ®·£Àè¼Ç ³»¿¡¼ ¸¸³ªµµ SELECT¹®ÀÌ 2ȸ ¿¬¼ÓÇØ ¹ßÇàÇßÀ» °æ¿ì, ÃÖÃÊÀÇSELECT Ä¿¸Çµå¸¦ ó¸®Çϰí ÀÖ´Â Áß°£¿¡ ´Ù¸¥ Æ®·£Àè¼ÇÀÇ °»½ÅÀÌ Ã³¸®µÇ¸é, ÃÖÃÊ¿Í ±× ´ÙÀ½¿¡ ¹ßÇàÇÑSELECTÄõ¸®´Â ´Ù¸¥ µ¥ÀÌÅ͸¦ ÂüÁ¶ÇØ ¹ö¸®´Â °ÍÀ» ÁÖÀÇÇϽʽÿä.
UPDATE, DELETE, SELECT FOR UPDATE, ¹× SELECT FOR SHAREÄ¿¸àµå´Â ´ë»ó ÇàÀ» °Ë»öÇÒ ¶§ SELECTÄ¿¸àµå¿Í °°ÀÌ ÇൿÇÕ´Ï´Ù. ÀÌ·¯ÇÑ Ä¿¸àµå´Â, Äõ¸®°¡ °³½ÃµÈ ½ÃÁ¡¿¡¼ ÀÌ¹Ì Ã³¸®µÇ°í ÀÖ´Â ´ë»ó ÇุÀ» ¹ß°ßÇÕ´Ï´Ù. ±×·¯³ª ´ë»ó ÇàÀº ¹ß°ß µÉ ¶§±îÁö, ´Ù¸¥ µ¿½Ã Æ®·£Àè¼Ç¿¡ ÀÇÇØ ÀÌ¹Ì °»½Å(ȤÀº »èÁ¦³ª ¶ô)µÇ¾î ¹ö·ÈÀ»Áöµµ ¸ð¸¨´Ï´Ù. ÀÌ·¯ÇÑ °æ¿ì °»½ÅµÇ¾î¾ß ÇÒ Ã³¸®´Â, ÃÖÃÊ·Î °»½ÅµÈ Æ®·£Àè¼ÇÀÌ(¾ÆÁ÷ ÁøÇà Áß À̶ó¸é) ó¸® ȤÀº ·Ñ¹é(rollback) ÇÏ´Â °ÍÀ» ±â´Ù¸³´Ï´Ù. ÃÖÃÊÀÇ °»½Å 󸮰¡ ·Ñ¹é(rollback) µÇ¸é ±× °á°ú´Â ¹«½ÃµÇ¾î, 2¹øÂ°ÀÇ °»½Å 󸮷Π¿ø·¡ ¹ß°ßÇÑ ÇàÀÇ °»½ÅÀ» °è¼ÓÇÒ ¼ö ÀÖ½À´Ï´Ù. ÃÖÃÊÀÇ °»½Å 󸮰¡ 󸮵Ǹé, 2¹øÂ°ÀÇ °»½Å 󸮿¡¼´Â, ÃÖÃÊÀÇ °»½Å 󸮿¡ ÀÇÇØ ÇàÀÌ »èÁ¦µÇ¾úÀ» °æ¿ì´Â ±× ÇàÀ» ¹«½ÃÇÕ´Ï´Ù. ÃÖÃÊÀÇ °»½Å 󸮰¡ »èÁ¦Çϸé, ÇàÀÇ ¾÷µ¥ÀÌÆ®µÈ ¹öÀü¿¡ ¿¬»êµÇµµ·Ï Àû¿ëµÉ °ÍÀÔ´Ï´Ù. Ä¿¸àµåÀÇ °Ë»ö Á¶°Ç(WHERE±¸¹®)Àº, °»½ÅµÈ ÇàÀÌ °Ë»ö Á¶°Ç¿¡ ÀÏÄ¡ÇÏ´ÂÁö È®ÀÎÇϱâ À§ÇØ ÀçÆò°¡µË´Ï´Ù. °Ë»ö Á¶°Ç°ú ÀÏÄ¡ÇÏ´Â °æ¿ì, 2¹øÂ°ÀÇ °»½Å 󸮴Â, °»½ÅµÈ ÇàÀ¸·ÎºÎÅÍ Ã³¸®¸¦ °³½ÃÇÕ´Ï´Ù. (SELECT FOR UPDATE¹× SELECT FOR SHAREÀÇ °æ¿ì, ¶ô µÇ°í Ŭ¶óÀÌ¾ðÆ®¿¡ ¸®ÅϵǴ °ÍÀº °»½ÅµÈ ¹öÀüÀÇ ÇàÀ» ÀǹÌÇÕ´Ï´Ù. )
ÀÌ·¯ÇÑ ±¸Á¶¿¡ ÀÇÇØ ¾÷µ¥ÀÌÆ®µÈ Ä¿¸àµå°¡, ¼·Î ¸ð¼øµÈ snapshotÀ» ÂüÁ¶ÇÒ °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ Äõ¸®´Â, ¼·Î°¡ °»½ÅÇÏ·Á°í ÇÏ´Â, °°Àº Çà¿¡ ¿µÇâÀ» ¹ÌÄ¡´Â, µ¿½Ã ½ÇÇà ÁßÀÎ °»½Å Äõ¸®¿¡ ÀÇÇÑ °á°ú¸¦ ÂüÁ¶ÇÒ ¼ö ÀÖÁö¸¸, µ¥ÀÌÅͺ£À̽ºÀÇ ´Ù¸¥ Çà¿¡ ´ëÇÑ µ¿½Ã ½ÇÇàÀÇ Äõ¸® °á°ú´Â ÂüÁ¶ÇÒ ¼ö ¾ø½À´Ï´Ù. ÀÌ·¯ÇÑ µ¿ÀÛÀ» Çϱâ À§Çؼ º¹ÇÕ °Ë»ö Á¶°ÇÀ» Æ÷ÇÔÇÑ Äõ¸®¿¡ Read Committed ¸ðµå¸¦ »ç¿ëÇÏ´Â °ÍÀº ÀûÀýÇÏÁö´Â ¾Ê½À´Ï´Ù. ±×·¯³ª º¸´Ù ´Ü¼øÇÑ °Ë»ö Á¶°ÇÀÇ °æ¿ì, ÀÌ ¸ðµåÀÇ »ç¿ëÀº ÀûÇÕÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, ÀºÇàÀÇ ÀÜ°í¸¦ °»½ÅÇÏ´Â ÀÌÇÏ¿Í °°Àº Æ®·£Àè¼ÇÀ» »ý°¢ÇØ º¸°Ú½À´Ï´Ù.
BEGIN; UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 12345; UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 7534; COMMIT;
µ¿½Ã¿¡ ½ÇÇàµÇ´Â 2°³ÀÇ Æ®·£Àè¼ÇÀÌ, °èÁ ¹øÈ£ 12345ÀÇ ÀÜ°í¸¦ º¯°æÇÏ·Á°í ÇßÀ» °æ¿ì, °èÁ 12345ÀÇ ÇàÀÌ °»½ÅµÇ°í ³ª¼ 2¹øÂ°ÀÇ Æ®·£Àè¼ÇÀ» °³½ÃÇØ¾ß ÇÕ´Ï´Ù. °¢ Ä¿¸àµå°¡ »çÀü¿¡ °áÁ¤ÇÑ Çà¿¡¸¸ 󸮸¦ ½Ç½ÃÇϱ⠶§¹®¿¡, °»½ÅµÈ ¹öÀüÀÇ ÇàÀº ¹®Á¦°¡ µÇ´Â ºÒÀÏÄ¡¸¦ ÀÏÀ¸Å°Áö ¾Ê½À´Ï´Ù.
Read Committed ¸ðµå¿¡¼ °¢°¢ÀÇ »õ·Î¿î Ä¿¸àµå´Â ±× ½ÃÁ¡¿¡ 󸮵Ǵ ¸ðµç Æ®·£Àè¼ÇÀ» Æ÷ÇÔÇÑ ½Å±Ô snapshotÀ» »ç¿ëÇØ ½ÇÇàÀ» °³½ÃÇÕ´Ï´Ù. ¶§¹®¿¡ µ¿ÀÏ Æ®·£Àè¼Ç ³»ÀÇ ´ÙÀ½ Ä¿¸àµå´Â ¾î¶°ÇÑ °æ¿ì¿¡µµ ó¸®µÈ µ¿½Ã Æ®·£Àè¼ÇÀÇ °á°ú¸¦ ÂüÁ¶ÇÏ°Ô µË´Ï´Ù. ÀÌ ¹®Á¦ÀÇ Æ÷ÀÎÆ®´Â Çϳª ÀÇ Ä¿¸àµå ³»¿¡¼, ¿ÏÀüÇÏ°Ô ÀϰüµÈ µ¥ÀÌÅͺ£À̽ºÀÇ ºä¸¦ ÂüÁ¶Çϰí Àִ°¡ ÇÏ´Â °ÍÀÔ´Ï´Ù.
Read Committed ¸ðµå·Î Á¦°øµÇ°í ÀÖ´Â ºÎºÐÀûÀÎ Æ®·£Àè¼Ç °Ý¸®´Â ¸¹Àº ¾îÇø®ÄÉÀ̼ǿ¡ ÀûÇÕÇÕ´Ï´Ù. ±×¸®°í ÀÌ ¸ðµå´Â ºü¸£¸ç »ç¿ë¹ýµµ °£´ÜÇÕ´Ï´Ù. ±×·¯³ª º¹ÀâÇÑ Äõ¸®³ª °»½ÅÀ» ½Ç½ÃÇÏ´Â ¾îÇø®ÄÉÀ̼ǿ¡¼´Â, Read Committed ¸ðµå·Î Á¦°øµÇ´Â °Íº¸´Ù, µ¥ÀÌÅͺ£À̽º¿¡ ´ëÇØ¼ ¾ö¹ÐÇÏ°Ô Àϰü¼ºÀÌ ÀÖ´Â º¸ÀÌ´Â ¹æ¹ýÀ» º¸ÁõÇÒ Çʿ䰡 ÀÖÀ»Áöµµ ¸ð¸¨´Ï´Ù.
Serializable·¹º§Àº, Æ®·£Àè¼ÇÀÇ °Ý¸®¿¡¼ °¡Àå ¾ö°ÝÇÑ °ÍÀÔ´Ï´Ù. ÀÌ ·¹º§¿¡¼´Â Æ®·£Àè¼ÇÀÌ µ¿½Ã¿¡ ÀϾ±â º¸´Ù´Â ÀÕ´Þ¾Æ, ¸¶Ä¡ ¼ø¼´ë·Î ½ÇÇàµÇµµ·Ï ¿¬¼ÓÀûÀÎ Æ®·£Àè¼ÇÀÇ ½ÇÇàÀ» ¿¡¹Ä·¹ÀÌÆ®ÇÕ´Ï´Ù. ±×·¯³ª ÀÌ ·¹º§À» »ç¿ëÇÑ ¾îÇø®ÄÉÀ̼ǿ¡¼´Â, Á÷·ÄÈÀÇ ½ÇÆÐ¿¡ ÀÇÇÑ Æ®·£Àè¼Ç Àç½ÇÇàÀ» ÁغñÇØ µÑ Çʿ䰡 ÀÖ½À´Ï´Ù.
Æ®·£Àè¼ÇÀÌ Serializable °Ý¸® ·¹º§¿¡ ÀÖÀ» ¶§SELECTÄõ¸®¸¦ ½ÇÇàÇϸé, Æ®·£Àè¼ÇÀÌ °³½ÃµÇ±â Àü±îÁö ó¸®µÈ µ¥ÀÌÅ͸¸À» ÂüÁ¶ÇÕ´Ï´Ù. 󸮵ÇÁö ¾ÊÀº µ¥ÀÌÅͳª Æ®·£Àè¼ÇÀÇ ½ÇÇà Áß¿¡ ´Ù¸¥ Æ®·£Àè¼ÇÀ¸·Î °»½ÅµÈ µ¥ÀÌÅÍ´Â ÂüÁ¶ÇÏÁö ¾Ê½À´Ï´Ù (±×·¯³ª SELECTÀº Æ®·£Àè¼Ç ³»¿¡ ¾ÆÁ÷ 󸮵ÇÁö ¾ÊÀº µ¥ÀÌÅ͸¦ ÂüÁ¶ÇÕ´Ï´Ù). SELECTÀº Æ®·£Àè¼Ç ³»ÀÇ Äõ¸®°¡ ½ÃÀÛÇÑ ½ÃÁ¡ÀÌ ¾Æ´Ñ, Æ®·£Àè¼Ç ±× ÀÚü°¡ ½ÃÀ۵ǾúÀ» ¶§ »óÅÂÀÇ snapshotÀ» ÂüÁ¶ÇÑ´Ù´Â Á¡À¸·Î½á Read Committed ·¹º§°ú´Â ´Ù¸¨´Ï´Ù. µû¶ó¼, ´ÜÀÏ Æ®·£Àè¼Ç ³»¿¡ ¿¬¼ÓÇÏ´ÂSELECT Ä¿¸Çµå´Â Ç×»ó °°Àº µ¥ÀÌÅ͸¦ ÂüÁ¶Çϰí ÀÖ°Ô µË´Ï´Ù.
UPDATE, DELETE, SELECT FOR UPDATE, ¹× SELECT FOR SHAREÄ¿¸àµå¿¡¼´Â SELECT¿Í °°ÀÌ ´ë»ó ÇàÀ» °Ë»öÇÕ´Ï´Ù. ÀÌ·¯ÇÑ Ä¿¸àµå´Â Æ®·£Àè¼ÇÀÌ °³½ÃµÈ ½ÃÁ¡¿¡¼ 󸮵ǰí ÀÖ´Â ´ë»ó ÇุÀ» ¹ß°ßÇÕ´Ï´Ù. ±×·¯³ª ±× ´ë»ó ÇàÀº ¹ß°ß µÉ ¶§±îÁö ´Ù¸¥ µ¿½Ã Æ®·£Àè¼Ç¿¡ ÀÇÇØ ÀÌ¹Ì °»½Å(ȤÀº »èÁ¦³ª ¶ô)µÆÀ» °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ °æ¿ì, serializable Æ®·£Àè¼ÇÀº ÃÖÃÊÀÇ °»½Å Æ®·£Àè¼ÇÀÌ(¾ÆÁ÷ ÁøÇà ÁßÀÏ °æ¿ì) ó¸® ȤÀº ·Ñ¹é(rollback) ÇÏ´Â °ÍÀ» ±â´Ù¸³´Ï´Ù. ÃÖÃÊÀÇ °»½Å 󸮰¡ ·Ñ¹é(rollback) µÇ¸é, ±× °á°ú´Â ¹«½ÃµÇ¾î serializable Æ®·£Àè¼Ç¿¡¼´Â ¿ø·¡ ¹ß°ßÇÑ ÇàÀÇ °»½ÅÀ» °è¼ÓÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¯³ª ÃÖÃÊÀÇ °»½ÅÀÌ Ã³¸®(±×¸®°í ´ÜÁö ¶ô µÉ »Ó ¾Æ´Ï¶ó, ½ÇÁ¦·Î ÇàÀÌ °»½Å ¶Ç´Â »èÁ¦)µÇ¸é, serializable Æ®·£Àè¼Ç¿¡¼´Â ÀÌÇÏ¿Í °°Àº ¸Þ¼¼Áö¸¦ Ãâ·ÂÇØ ·Ñ¹é(rollback)¸¦ ½Ç½ÃÇÕ´Ï´Ù.
ERROR: could not serialize access due to concurrent update
¿Ö³ÄÇϸé serializable Æ®·£Àè¼ÇÀº Æ®·£Àè¼ÇÀÌ °³½ÃµÈ ÈÄ, ´Ù¸¥ Æ®·£Àè¼Ç¿¡ ÀÇÇØ °»½ÅµÈ ÇàÀ» º¯°æÇϰųª ¶ô ÇÒ ¼ö°¡ ¾ø±â ¶§¹®ÀÔ´Ï´Ù.
¾îÇø®ÄÉÀ̼ÇÀÌ ÀÌ·¯ÇÑ ¿¡·¯ ¸Þ¼¼Áö¸¦ ¹Þ¾Æµé¿´À» °æ¿ì, ÇöÀçÀÇ Æ®·£Àè¼ÇÀ» Áß´ÜÇϰí, Æ®·£Àè¼Ç Àüü¸¦ ´Ù½Ã ½ÃÀÛÇØ¾ß ÇÕ´Ï´Ù. 2 ¹øÂ°´Â Æ®·£Àè¼ÇÀÌ ÀÌÀü¿¡ ó¸®µÈ º¯°æÀ» µ¥ÀÌÅͺ£À̽ºÀÇ ÃÖÃÊ »óÅ·Π°£ÁÖÇϹǷÎ, »õ·Î¿î ¹öÀüÀÇ ÇàÀ» »õ·Î¿î Æ®·£Àè¼ÇÀÇ °»½Å¸¦ À§ÇØ ½ÃÀÛ ½ÃÁ¡¿¡¼ »ç¿ëÇØµµ, ³í¸®Àû ¸ð¼øÀº ÀϾÁö ¾Ê½À´Ï´Ù.
°»½Å Æ®·£Àè¼Ç¸¸ Àç½ÇÇàÇÒ Çʿ䰡 ÀÖÀ»Áöµµ ¸ð¸¨´Ï´Ù. read Àü¿ë Æ®·£Àè¼Ç¿¡¼´Â Á÷·ÄÈÀÇ Ãæµ¹ÀÌ °áÄÚ ÀϾÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù.
Á÷·ÄÈ ¸ðµå¿¡¼ ¸ðµç Æ®·£Àè¼ÇÀÌ ÀϰüµÈ µ¥ÀÌÅͺ£À̽º »óŸ¦ ÂüÁ¶ÇÒ ¼ö ÀÖ´Â °ÍÀÌ º¸ÁõµË´Ï´Ù. ±×·¯³ª µ¿½Ã ¾÷µ¥ÀÌÆ®°¡ ¿¬¼ÓµÈ ½ÇÇàÀ» À¯ÁöÇϴ ȯ»óÀ» ºÒ°¡´ÉÇÏ°Ô ¸¸µé ¶§, ¾îÇø®ÄÉÀ̼ÇÀº Æ®·£Àè¼ÇÀ» Àç½ÇÇàÇÒ Áغñ¸¦ ÇØµÎ¾î¾ß¸¸ ÇÕ´Ï´Ù º¹ÀâÇÑ Æ®·£Àè¼ÇÀ» Àç½ÇÇàÇÒ ¶§ÀÇ ÄÚ½ºÆ®¸¦ ¹«½ÃÇÒ ¼ö ¾øÀ» Á¤µµ·Î Ŭ ¼ö ÀÖÀ¸¹Ç·Î, ÀÌ ¸ðµå´Â Read Committed ¸ðµå¿¡¼´Â À߸øÇÑ °á°ú¸¦ ÁÙ °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù ±×·¯¹Ç·Î º¹ÀâÇÑ ³í¸®¸¦ °¡Áö´Â °»½Å Æ®·£Àè¼ÇÀ» ½ÇÇàÇÏ´Â °æ¿ì¿¡°Ô¸¸ »ç¿ëÇÏ´Â °ÍÀ» ÃßõÇÕ´Ï´Ù. ´ëºÎºÐÀÇ °æ¿ì, Á÷·ÄÈ ¸ðµå´Â µ¥ÀÌÅͺ£À̽ºÀÇ µ¿ÀÏ ºä¸¦ ÂüÁ¶Çؾ߸¸ ÇÏ´Â ¸î¸îÀÇ ¿¬¼ÓÇÏ´Â Äõ¸®¸¦ Æ®·£Àè¼ÇÀÌ Ã³¸®ÇÒ ¶§ ÇÊ¿äÇÕ´Ï´Ù.
"serializable"ÀÎ ½ÇÇàÀÇ Á÷°üÀû ÀǹÌ(±×¸®°í ¼öÇÐÀû Á¤ÀÇ)´Â ¼º°øÀûÀ¸·Î ó¸®µÈ 2°³ÀÇ µ¿½Ã Æ®·£Àè¼ÇÀÌ ¾ö°ÝÇÏ°Ô ¿¬¼ÓÀûÀ¸·Î ½ÇÇàµÉ °ÍÀ̶ó´Â °Ì´Ï´Ù. ±×·¯³ª 2 °³ÀÇ Æ®·£Àè¼Ç Áß ¾î´À ÂÊÀÌ ¸ÕÀú ³ªÅ¸³¯±î¸¦ ¹Ì¸® ¿¹ÃøÇÏ±ä ¾î·Æ½À´Ï´Ù. Table 12-1¿¡ ³ªÅ¸³½ Á÷·ÄÈÇÒ ¼ö ¾ø´Â ÇൿÀ» ±ÝÁöÇÏ´Â °ÍÀÌ ÁøÁ¤ÇÑ Á÷·Ä¼ºÀ» ÃæºÐÈ÷ º¸ÁõÇÏÁö ¾Ê´Â ´Ù´Â °ÍÀ» ¾Æ´Â °ÍÀº Áß¿äÇÕ´Ï´Ù. ±×¸®°í ½ÇÁ¦ PostgreSQLÀÇ serializable ¸ðµå´Â ÀÌ Á¡ ¶§¹®¿¡ Á÷·ÄÈ ½ÇÇàÀ» º¸ÁõÇÏÁö ¾Ê½À´Ï´Ù . ¿¹¸¦ µé¾î, ¾Æ·¡¿Í °°Àº Ãʱ⠵¥ÀÌÅ͸¦ °¡Áö´Âmytab¶ó°í ÇÏ´Â Å×À̺íÀ» »ý°¢ÇØ º¸°Ú½À´Ï´Ù.
class | value
-------+-------
1 | 10
1 | 20
2 | 100
2 | 200
serializable Æ®·£Àè¼Ç A°¡ °è»êÇÑ´Ù°í °¡Á¤Çϰí
SELECT SUM(value) FROM mytab WHERE class = 1;
value¿¡ °á°ú(30)¸¦ »õ·Î¿î class = 2ÀÇ Çà¿¡ »ðÀÔÇÕ´Ï´Ù. µ¿½Ã¿¡ serializable Æ®·£Àè¼Ç B´Â ÀÌÇϸ¦ °è»êÇÕ´Ï´Ù
SELECT SUM(value) FROM mytab WHERE class = 2;
±× °á°ú·Î 300À» ¾òÀ¸¸ç°í °á°ú¸¦ class = 1ÀÇ Çà¿¡ »ðÀÔÇÕ´Ï´Ù. ±×·± ´ÙÀ½, ¾çÂÊÀÇ Æ®·£Àè¼ÇÀ» ó¸®ÇÕ´Ï´Ù. ¿©±â¿¡¼´Â Àü¼úÀÇ Á÷·ÄÈÇÒ ¼ö ¾ø´Â ÇൿÀº ¾ø½À´Ï´Ù¸¸, ¾î´À ÂÊÀ» ¸ÕÀú Á÷·ÄÈÇß´Ù°í ÇØµµ ¹ß»ýÇÒ ¼ö ¾ø´Â °á°ú°¡ µË´Ï´Ù. ¸¸¾à A°¡ Bº¸´Ù Àü¿¡ ½ÇÇàÇß´Ù°í Çϸé, BÀÇ ÇÕ°è´Â 300ÀÌ ¾Æ´Ñ 330À¸·Î °è»êµË´Ï´Ù. À̰ú °°ÀÌ ´Ù¸¥ ¼ø¼·Î ½ÇÇàµÇ´õ¶óµµ A·Î °è»êµÇ´Â ÇÕ°è´Â ´Ù¸¥ °á°ú°¡ ³ª¿É´Ï´Ù.
¼öÇÐÀûÀ¸·Î ¿Ã¹Ù¸¥ Á÷·Ä¼ºÀ» º¸ÁõÇϱâ À§ÇØ µ¥ÀÌÅͺ£À̽º ½Ã½ºÅÛÀº ¼ú¾î ¶ô(predicate locking) 󸮸¦ °Á¦ÀûÀ¸·Î ½Ç½ÃÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ÀÌ´Â µ¿½Ã ½ÇÇàÇÏ´Â Æ®·£Àè¼ÇÀÇ Äõ¸® WHEREÁ¶°Ç¿¡ ÀÏÄ¡ÇÏ´Â ÇàÀ» ´Ù¸¥ Æ®·£Àè¼ÇÀ¸·ÎºÎÅÍ »ðÀÔ, º¯°æ ÇÒ ¼ö ¾ø´Ù´Â °ÍÀ» ÀǹÌÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, Æ®·£Àè¼Ç A°¡ SELECT ... WHERE class = 1À̶ó°í ÇÏ´Â Äõ¸®¸¦ ½ÇÇàÇßÀ» ¶§, ¼ú¾î ¶ô(predicate locking) ó¸® ½Ã½ºÅÛÀº Æ®·£Àè¼Ç A°¡ ó¸®µÉ ¶§±îÁö, Æ®·£Àè¼Ç B°¡ class°¡ »õ·Î¿î ÇàÀ» »ðÀÔÇÏ´Â °ÍÀ» ±ÝÁöÇÕ´Ï´Ù. [1] ¸ðµç ¼¼¼ÇÀÌ µ¿½Ã Æ®·£Àè¼ÇÀ¸·Î ½ÇÇàµÈ ¸ðµç Äõ¸®ÀÇ ¼¼ºÎ »çÇ×À» ÀνÄÇØ¾ßÇϹǷÎ, ÀÌ·¯ÇÑ ¶ô ó¸® ½Ã½ºÅÛÀÇ ½ÇÇàÀº º¹ÀâÇÏ°í ºñ½Ô´Ï´Ù. ±×¸®°í ½ÇÁ¦·Î ´ëºÎºÐÀÇ ¾îÇø®ÄÉÀ̼ÇÀº ÀÌ·¯ÇÑ ¹®Á¦°¡ »ý±æ¸¸ÇÑ ¿¬»êÀ» ÇÏÁö ¾ÊÀ¸¹Ç·Î, °í°¡ÀÇ ÀÛ¾÷ÀÇ ´ëºÎºÐÀº ¾µ¸ð°¡ ¾ø½À´Ï´Ù. (È®½ÇÈ÷ À§ÀÇ ¿¹´Â ¾ïÁö·Î »ý°¢ÇØ ³½ °ÍÀ¸·Î, ½ÇÁ¦ ¼ÒÇÁÆ®¿þ¾î¿¡¼ ÇàÇØÁú °¡´É¼ºÀº °ÅÀÇ ¾ø½À´Ï´Ù). µû¶ó¼ PostgreSQL´Â ¼ú¾î ¶ô(predicate locking) 󸮸¦ ½ÇÇàÇϰí ÀÖ½À´Ï´Ù.
Á÷·ÄÈ µÇÁö ¾ÊÀ» °¡´É¼ºÀÌ ÀÖ´Â °ÍÀÌ ½ÇÁ¦·Î Àå¾Ö°¡ µÉ °æ¿ì´Â, ¸í½ÃÀû ¶ô 󸮸¦ ÀûÀýÈ÷ »ç¿ëÇÏ¿© ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌÇÏÀÇ ´Ü¶ô¿¡¼ º¸´Ù »ó¼¼ÇÏ°Ô ¼³¸íÇÕ´Ï´Ù.
| [1] |
±âº»ÀûÀ¸·Î, ¼ú¾î ¶ô(predicate locking) ½Ã½ºÅÛÀº ÀԷµǴ °ÍÀ» Á¦ÇÑÇÏ¿© phantom read¸¦ ¿¹¹æÇϰí, MVCC´Â ÀÐÈ÷´Â °ÍÀ» Á¦ÇÑÇÏ¿© phantom read¸¦ ¸·½À´Ï´Ù. |