| PostgreSQL 8.3.3¹®¼ | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 3. Çâ»óµÈ Ư¡ | Fast Forward | Next |
Æ®·£Àè¼Ç(transactions)Àº ¸ðµç µ¥ÀÌÅͺ£À̽º ½Ã½ºÅÛÀÇ ±âÃÊ °³³äÀÔ´Ï´Ù. Æ®·£Àè¼ÇÀÇ Çʼö ¿äÁ¡Àº Æ®·£Àè¼ÇÀÌ ´ÜÀÏÀÇ È¤Àº ÀüºÎ ½ÇÇàÇϰųª ÀüÇô ½ÇÇàÇÏÁö ¾Ê´Â º¹ÇÕÀûÀÎ ´Ü°è¸¦ ³ªÅ¸³½´Ù´Â °ÍÀÔ´Ï´Ù. ´Ü°èÀÇ ÁøÇà »óÅ´ µ¿½Ã¿¡ ¿òÁ÷ÀÌ´Â ´Ù¸¥ Æ®·£Àè¼Ç¿¡°Ô º¸ÀÌÁö ¾Ê½À´Ï´Ù. ¶ÇÇÑ, ¿¡·¯°¡ ¹ß»ýÇÒ °æ¿ì Æ®·£Àè¼ÇÀº ¿Ï·áµÇÁö ¾ÊÀ¸¸ç µ¥ÀÌÅͺ£À̽º¿¡ ¾Æ¹«·± ¿µÇâÀ» ÁÖÁö ¾Ê½À´Ï´Ù.
¿¹¸¦ µé¾î, ÀºÇàÀÇ µ¥ÀÌÅͺ£À̽º°¡ ´Ù¼öÀÇ °í°´ÀÇ °èÁ Àܰí¿Í ÁöÁ¡ÀÇ ÃÑ¿¹±ÝÀÜ°í¸¦ ±â·ÏÇÏ´Â °ÍÀ» »ý°¢Çغ¾½Ã´Ù. AliceÀÇ °èÁ·κÎÅÍ $100.00¸¦ BobÀÇ °èÁ·Π¼Û±ÝÇÑ °ÍÀ» ±â·ÏÇϰíÀÚ ÇÑ´Ù¸é, ±ØÈ÷ °£·«È ÇÒ °æ¿ì SQL ±¸¹®Àº ´ÙÀ½°ú °°ÀÌ µË´Ï´Ù.
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice';
UPDATE branches SET balance = balance - 100.00
WHERE name = (SELECT branch_name FROM accounts WHERE name = 'Alice');
UPDATE accounts SET balance = balance + 100.00
WHERE name = 'Bob';
UPDATE branches SET balance = balance + 100.00
WHERE name = (SELECT branch_name FROM accounts WHERE name = 'Bob');
¿©±â¼´Â ÀÌ·¯ÇÑ SQL ±¸¹®ÀÇ ¼¼ºÎ»çÇ×Àº Áß¿äÄ¡ ¾Ê½À´Ï´Ù. Áß¿äÇÑ Á¡Àº ÀÌ ´Ü¼øÇÑ ¿¬»êÀ» ¿Ï¼öÇϱâ À§ÇØ °³º°ÀûÀ¸·Î µ¶¸³µÈ ¾÷µ¥ÀÌÆ®°¡ ¿¬°èµÈ´Ù´Â °ÍÀÔ´Ï´Ù. ÀºÇà Á÷¿øÀº ¹ß»ýÇÑ ¸ðµç ¾÷µ¥ÀÌÆ® ¶Ç´Â ¾Æ¹«·± ¾÷µ¥ÀÌÆ®µµ ¹ß»ýÇÏÁö ¾Ê¾Ò´Ù´Â °ÍÀ» È®½ÅÇϰíÀÚÇÕ´Ï´Ù. ½Ã½ºÅÛÀÇ ½ÇÆÐ·Î ÀÎÇØ Alice·ÎºÎÅÍ ÀÎÃâµÇÁö ¾Ê¾Æ BobÀÌ $100. 00À» ¹ÞÀ» ¼ö ¾ø´Â »óȲÀÌ ÀϾ°Å³ª BobÀ» ÆÇ¸íÇÏ´Â ´Ü°è ¾øÀÌ AliceÀÇ µ·ÀÌ ÀÎÃâµÈ´Ù¸é Alice´Â ÀºÇàÀÇ °í°´À¸·Î ³²Áö ¾ÊÀ» °ÍÀÔ´Ï´Ù. ½Ã½ºÅÛÀÇ ½ÇÇà µµÁß ÀϺΠºÎÀû´çÇÑ »óȲÀÌ ¹ß»ýÇÒ °æ¿ì, °á°ú¿¡ ¿µÇâÀ» ÁÙ ¼ö ÀÖ´Â ¾î¶°ÇÑ ´Ü°èµµ ½ÇÇàµÇÁö ¾Ê´Â´Ù´Â È®ÁõÀÌ ÇÊ¿äÇÕ´Ï´Ù. ÀÌ´Â ¾÷µ¥ÀÌÆ® µÇ´Â ºÎºÐÀ» Æ®·£Àè¼Ç(transaction)¿¡ ±×·ìÈÇÏ¿© ¾òÀ» ¼ö ÀÖ½À´Ï´Ù. ÀÌ´Â Æ®·£Á§¼ÇÀÌ ´Ù¸¥ Æ®·£Á§¼Ç°ú ¿ÏÀüÈ÷ ¹ß»ýÇÏ¿´´Â°¡ ÀüÇô ¹ß»ýÇÏÁö ¾Ê¾Ò´Â°¡ ÇÏ´Â °üÁ¡À¸·Î ¿øÀÚ¼ºÀ¸·Î ºÒ¸³´Ï´Ù.
Çѹø Æ®·£Àè¼ÇÀÌ µ¥ÀÌÅͽýºÅÛ¿¡ ÀÇÇØ ½ÂÀεǰųª ¿Ï°áµÇ¸é, ¿µ±¸ÀûÀ¸·Î ±â·ÏµÇ°í Á÷ÈÄ¿¡ Å©·¡½¬°¡ ¹ß»ýÇÏ¿©µµ ¼Õ½ÇµÇÁö ¾Ê½À´Ï´Ù. ¿¹¸¦ µé¸é, BobÀÌ ÀÚ½ÅÀÇ °èÁ·κÎÅÍ Çö±ÝÀ» ÀÎÃâÇßÀ» ¶§ ÀºÇà ¹®À» ³ª¼ÀÚ¸¶ÀÚ ½Ã½ºÅÛÀÇ Å©·¡½¬·Î ÀÎÃâ ±â·ÏÀÌ »ç¶óÁö´Â °ÍÀ» ¿øÇÏÁö ¾Ê½À´Ï´Ù. Æ®·£Á§¼ÇÀ» Áö¿øÇÏ´Â µ¥ÀÌÅͺ£À̽º¿¡¼´Â Æ®·£Á§¼ÇÀÇ ¿Ï·á¸¦ º¸°íÇϱâ Àü¿¡ ¿µ¼ÓÀû ±â·Ï ÀåÄ¡(Áï µð½ºÅ©»ó)¿¡ ¸ðµç ¾÷µ¥ÀÌÆ® ºÎºÐÀÌ Æ®·£Á§¼ÇÀÌ ·Î±×µÇ¾îÁöµµ·Ï ¸¸µé¾î º¸ÁõÇϰí ÀÖ½À´Ï´Ù.
Æ®·£Á§¼ÇÀ» Áö¿øÇÏ´Â µ¥ÀÌÅͺ£À̽ºÀÇ ¶Ç´Ù¸¥ Áß¿äÇÑ Æ¯Â¡Àº ¿øÀÚÀû °»½ÅÀÇ °³³ä°ú ±íÀº °ü°è°¡ ÀÖ½À´Ï´Ù. ´Ù¼öÀÇ Æ®·£Á§¼ÇÀÌ µ¿½Ã¿¡ ¹ß»ýÇÒ °æ¿ì, °¢°¢ÀÇ Æ®·£Á§¼ÇÀº ´Ù¸¥ Æ®·£Á§¼ÇÀ¸·Î ÀÎÇÑ ¹Ì¿Ï·áµÈ º¯°æÀ» ºÒ ¼ö ¾øµµ·Ï µÇ¾î ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¸é, ÇϳªÀÇ Æ®·£Àè¼ÇÀÌ ¸ðµç ÁöÁ¡ÀÇ ÀÜ°í¸¦ Áý°èÇÏ´Â ÀÛ¾÷À¸·Î ¹Ùºü AliceÀÇ °èÁ°¡ ÀÖ´Â ÁöÁ¡ÀÌ AliceÀÇ °èÁ ÀÎÃâÀ» ±â·ÏÇÏÁö ¾Ê°Å³ª, BobÀÇ °èÁ°¡ ÀÖ´Â ÁöÁ¡¿¡¼ ÀÌü¸¦ ±â·ÏÇÏÁö ¾Ê´Â °æ¿ì°¡ ÀϾ¼´Â ¾È µÉ °ÍÀÔ´Ï´Ù. (¹Ý´ëÀÇ °æ¿ìµµ Æ÷ÇÔ) Áï, Æ®·£Á§¼ÇÀÌ µ¥ÀÌÅͺ£À̽º¿¡ ¿µ±¸ÀûÀÎ ¿µÇâÀ» ÁÖ´Â °æ¿ì »Ó¸¸ ¾Æ´Ï¶ó Æ®·£Á§¼ÇÀÇ ¹ß»ýÇÏ´Â ½ÃÁ¡ÀÇ °¡½Ã¼ºÀ» ¿°µÎÇÏ¿© Æ®·£Á§¼ÇÀÌ ¿¬»ê Àüü°¡ 󸮵ǰųª Àüü°¡ 󸮵ÇÁö ¾Êµµ·Ï ÇØ¾ßÇÕ´Ï´Ù. ÀÛ¾÷ÁßÀÇ Æ®·£Á§¼Ç¿¡ ÀÇÇÑ °»½ÅÀº ½ÇÇàÀÌ ¿Ï·áµÉ ¶§±îÁö ´Ù¸¥ Æ®·£Á§¼Ç¿¡°Ô º¸¿©ÁöÁö ¾ÊÀ¸¸ç, Æ®·£Àè¼ÇÀÌ ¿Ï·áµÈ ÈÄ¿¡ ¸ðµç °»½Å »çÇ×ÀÌ º¸¿©Áö°Ô µË´Ï´Ù.
PostgreSQL¿¡¼´Â Æ®·£Àè¼ÇÀ» ±¸¼ºÇÏ´Â SQL ±¸¹®À» BEGIN°ú COMMITÀÇ Æ®·£Á§¼ÇÀ¸·Î µÑ·¯½Î ¼³Á¤ÇÕ´Ï´Ù. ÀºÇà °Å·¡ÀÇ Æ®·£Àè¼Ç ´ÙÀ½°ú °°½À´Ï´Ù.
BEGIN;
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice';
-- etc etc
COMMIT;
¸¸¾à, Æ®·£Á§¼Ç ó¸® µµÁß¿¡ ½ÇÇà 󸮸¦ ¿øÄ¡ ¾Ê´Â °æ¿ì°¡ »ý±ä´Ù¸é, (Alice °èÁÂÀÇ ÀÜ°í ºÎÁ·°ú °°Àº °æ¿ì) COMMIT À» ´ë½ÅÇÏ¿© ROLLBACK ¸í·ÉÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×¸®°í ¸ðµç °»½Å »çÇ×Àº Ãë¼ÒµÇ¾î Áú °ÍÀÔ´Ï´Ù.
PostgreSQL´Â ½ÇÁ¦ ¸ðµç SQL ¸í·É¹®À» Æ®·£Àè¼Ç ³»¿¡¼ ½ÇÇàÇϵµ·Ï µÇ¾î ÀÖ½À´Ï´Ù. ¸¸¾à BEGIN±¸¹®À» ½ÇÇàÇÏÁö ¾Ê¸é, °¢°¢ÀÇ ¸í·É¹®Àº ¾Ï¹¬ÀûÀ¸·Î BEGIN°ú (¼º°øÀûÀÏ °æ¿ì)COMMIT¸¦ ÀÌ¿ëÇØ BEGINÀ» °¨½Ô´Ï´Ù. BEGIN °ú COMMIT¿¡ ÀÇÇØ µÑ·¯½ÎÀÎ ¸í·É¹®ÀÇ ±×·ìÀº Æ®·£Á§¼Ç ºí·ÏÀ¸·Î ÀÏÄþîÁö±âµµ ÇÕ´Ï´Ù.
Note: ¸î¸îÀÇ Å¬¶óÀÌ¾ðÆ® ¶óÀ̺귯¸®´Â ÀÚµ¿ÀûÀ¸·Î BEGIN°ú COMMIT ±¸¹® ½ÇÇàÇÏ¿©, Áú¹® ¾øÀÌ Æ®·£Àè¼Ç ºí·ÏÀ» À¯È¿ÇÏ°Ô ÇÕ´Ï´Ù. ÇöÀç »ç¿ëÇϰí ÀÖ´Â ÀÎÅÍÆäÀ̽ºÀÇ ¹®¼¸¦ È®ÀÎÇØÁֽʽÿä.
¼¼ÀÌºê Æ÷ÀÎÆ®¸¦ »ç¿ëÇÏ¿© Æ®·£Àè¼Ç(transaction)ÀÇ ¸í·É¹®À» º¸´Ù ¼¼¹ÐÇÏ°Ô Á¦¾îÇÒ ¼ö ÀÖ½À´Ï´Ù. ¼¼ÀÌºê Æ÷ÀÎÆ®´Â Æ®·£Àè¼Ç(transaction)ÀÇ ºÎºÐÀ» ¼±ÅÃÀûÀ¸·Î ÆÄ±âÇϵµ·Ï Çϸç, ³ª¸ÓÁö ºÎºÐÀº 󸮵ǵµ·Ï ÇÕ´Ï´Ù. SAVEPOINT·Î ¼¼ÀÌºê Æ÷ÀÎÆ®¸¦ Á¤ÀÇÇÑ ÈÄ¿¡ ÇÊ¿äÇÒ °æ¿ì ROLLBACK TO¸¦ ÅëÇØ ¼¼ÀÌºê Æ÷ÀÎÆ®±îÁö ·Ñ¹é(rollback) ÇÒ ¼ö ÀÖ½À´Ï´Ù. Á¤ÀÇµÈ ¼¼ÀÌºê Æ÷ÀÎÆ®¿Í ·Ñ¹é(rollback) Æ÷ÀÎÆ® »çÀÌÀÇ ¸ðµç Æ®·£Àè¼Ç µ¥ÀÌÅͺ£À̽º º¯°æÀº ÆÄ±âµÇÁö¸¸, ¼¼ÀÌºê Æ÷ÀÎÆ® ÀÌÀüÀÇ º¯°æÀº À¯ÁöµË´Ï´Ù.
¼¼ÀÌºê Æ÷ÀÎÆ®±îÁö ·Ñ¹é(rollback)ÇÑ ÈÄ¿¡µµ ¼¼ÀÌºê Æ÷ÀÎÆ®´Â °è¼ÓÀûÀ¸·Î Á¤ÀǵǾîÁø´Ù. ±×·¯¹Ç·Î ·Ñ¹é(rollback)ÀÇ Æ÷ÀÎÆ® Á¤ÀÇ´Â ¸î ȸ¿¡ °ÉÃÄ °¡´ÉÇÕ´Ï´Ù. ¹Ý´ë·Î ƯÁ¤ÇÑ ¼¼À̺êÆ÷ÀÎÆ®¸¦ ÀçÂ÷ ·Ñ¹é(rollback)ÇÒ Çʿ䰡 ¾ø´Ù°í È®½ÅÇÒ °æ¿ì, ÀÌ´Â ÇØÁ¦µÇ¾î ½Ã½ºÅÛÀÇ ¸î°¡Áö system ÀÚ¿øÀ» ÀÚÀ¯·Ó°Ô ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¼¼ÀÌºê Æ÷ÀÎÆ®¸¦ ÇØÁ¦Çϰųª ¼¼ÀÌºê Æ÷ÀÎÆ®¿¡ ·Ñ¹é(rollback) ÇÏ´Â °ÍÀº ÀÚµ¿ÀûÀ¸·Î ±× ÈÄ¿¡ Á¤ÀÇµÈ ¸ðµç ¼¼ÀÌºê Æ÷ÀÎÆ®¸¦ ÇØÁ¦ÇÏ´Â °ÍÀÓÀ» ¸í½ÉÇϽʽÿä.
ÀÌ ¸ðµÎ´Â Æ®·£Á§¼Ç ºí·Ï ³»¿¡¼ ¹ß»ýÇϹǷÎ, ´Ù¸¥ µ¥ÀÌÅͺ£À̽º ¼¼¼Ç¿¡ ÀÇÇØ ³ëÃâµÇÁö ¾Ê½À´Ï´Ù. ¸¸¾à Æ®·£Á§¼Ç ºí·ÏÀÌ ½ÇÇàµÉ °æ¿ì, ó¸®µÈ ÇൿÀº ´Ù¸¥ ¼¼¼Ç¿¡ ÀÇÇØ ÇϳªÀÇ ´ÜÀ§·Î º¸¿©Áö°Ô µË´Ï´Ù. ±×·¯³ª ·Ñ¹é(rollback)¿¡ ÀÇÇÑ ÇൿÀº °áÄÚ °¡½ÃȵÇÁö ¾Ê½À´Ï´Ù.
ÀºÇà µ¥ÀÌÅͺ£À̽ºÀÇ ¿¹¸¦ ¶°¿Ã·Á º¾½Ã´Ù. AliceÀÇ °èÁ·ΠºÎÅÍ $100. 00À» ÀÎÃâÇÏ¿© BobÀÇ °èÁ·Π¼Û±ÝÀ» ÇÑ´Ù°í ÇÕ´Ï´Ù. ±×·¯³ª ½Ã°£ÀÌ Áö³ª BobÀÌ ¾Æ´Ñ WallyÀÌ °èÁ·Π¼Û±ÝµÇ¾ß ÇÑ´Ü °ÍÀ» ±ú´Þ¾Ò½À´Ï´Ù. ÀÌ °æ¿ì ¼¼À̺êÆ÷ÀÎÆ®´Â ´ÙÀ½°ú °°ÀÌ »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù.
BEGIN;
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice';
SAVEPOINT my_savepoint;
UPDATE accounts SET balance = balance + 100.00
WHERE name = 'Bob';
ROLLBACK TO my_savepoint;
UPDATE accounts SET balance = balance + 100.00
WHERE name = 'Wally';
COMMIT;
¹°·Ð ÀÌ ¿¹´Â ±Ø´ÜÀûÀ¸·Î ´Ü¼øÈµÇ¾úÁö¸¸, ¼¼À̺êÆ÷ÀÎÆ®ÀÇ »ç¿ëÀ» ÅëÇØ Æ®·£Àè¼Ç ºí·ÏÀÇ ¸¹Àº Á¦¾î¸¦ ½Ç½ÃÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ¾Ë·ÁÁÝ´Ï´Ù. °Ô´Ù°¡ ¿¡·¯·Î ÀÎÇØ ½Ã½ºÅÛÀÌ Æ®·£Àè¼Ç ºí·ÏÀ» Áß´ÜÇÒ »óȲ¿¡ óÇÒ °æ¿ì, ROLLBACK TOÀº ·Ñ¹é(rollback)¸¦ ¿Ï°á½ÃŰÁö ¾Ê°í Àç°³½Ã ½Ã۱â À§ÇØ Á¦¾î¸¦ µÇãÀ» ¼ö ÀÖ´Â À¯ÀÏÇÑ ¼ö´ÜÀÔ´Ï´Ù.