±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÊÂÎñµÄ»ù±¾ÒªËØ£¬ÊÂÎñµÄ²¢·¢ÎÊÌ⣬MySQLÊÂÎñ¸ôÀë¼¶±ð£¬×îºóÓÃÀý×Ó˵Ã÷¸÷¸ö¸ôÀë¼¶±ðµÄÇé¿ö£¬¸ü¶àÏêÇéÇëÔĶÁÏÂÎÄ¡£
±¾ÎÄÀ´×Ô²©¿ÍÔ°£¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼¡¢ÍƼö¡£ |
|
Ò»¡¢ÊÂÎñµÄ»ù±¾ÒªËØ£¨ACID£©
1¡¢Ô×ÓÐÔ£¨Atomicity£©£ºÊÂÎñ¿ªÊ¼ºóËùÓвÙ×÷£¬ÒªÃ´È«²¿×öÍ꣬Ҫôȫ²¿²»×ö£¬²»¿ÉÄÜÍ£ÖÍÔÚÖм价½Ú¡£ÊÂÎñÖ´Ðйý³ÌÖгö´í£¬»á»Ø¹öµ½ÊÂÎñ¿ªÊ¼Ç°µÄ״̬£¬ËùÓеIJÙ×÷¾ÍÏñûÓз¢ÉúÒ»Ñù¡£Ò²¾ÍÊÇ˵ÊÂÎñÊÇÒ»¸ö²»¿É·Ö¸îµÄÕûÌ壬¾ÍÏñ»¯Ñ§ÖÐѧ¹ýµÄÔ×Ó£¬ÊÇÎïÖʹ¹³ÉµÄ»ù±¾µ¥Î»¡£
2¡¢Ò»ÖÂÐÔ£¨Consistency£©£ºÊÂÎñ¿ªÊ¼Ç°ºÍ½áÊøºó£¬Êý¾Ý¿âµÄÍêÕûÐÔÔ¼ÊøÃ»Óб»ÆÆ»µ ¡£±ÈÈçAÏòBתÕË£¬²»¿ÉÄÜA¿ÛÁËÇ®£¬BȴûÊÕµ½¡£
3¡¢¸ôÀëÐÔ£¨Isolation£©£ºÍ¬Ò»Ê±¼ä£¬Ö»ÔÊÐíÒ»¸öÊÂÎñÇëÇóͬһÊý¾Ý£¬²»Í¬µÄÊÂÎñÖ®¼ä±Ë´ËûÓÐÈκθÉÈÅ¡£±ÈÈçAÕýÔÚ´ÓÒ»ÕÅÒøÐп¨ÖÐȡǮ£¬ÔÚAȡǮµÄ¹ý³Ì½áÊøÇ°£¬B²»ÄÜÏòÕâÕÅ¿¨×ªÕË¡£
4¡¢³Ö¾ÃÐÔ£¨Durability£©£ºÊÂÎñÍê³Éºó£¬ÊÂÎñ¶ÔÊý¾Ý¿âµÄËùÓиüн«±»±£´æµ½Êý¾Ý¿â£¬²»Äܻعö¡£
¶þ¡¢ÊÂÎñµÄ²¢·¢ÎÊÌâ
1¡¢Ôà¶Á£ºÊÂÎñA¶ÁÈ¡ÁËÊÂÎñB¸üеÄÊý¾Ý£¬È»ºóB»Ø¹ö²Ù×÷£¬ÄÇôA¶ÁÈ¡µ½µÄÊý¾ÝÊÇÔàÊý¾Ý
2¡¢²»¿ÉÖØ¸´¶Á£ºÊÂÎñ A ¶à´Î¶ÁȡͬһÊý¾Ý£¬ÊÂÎñ B ÔÚÊÂÎñA¶à´Î¶ÁÈ¡µÄ¹ý³ÌÖУ¬¶ÔÊý¾Ý×÷Á˸üв¢Ìá½»£¬µ¼ÖÂÊÂÎñA¶à´Î¶ÁȡͬһÊý¾Ýʱ£¬½á¹û
²»Ò»Ö¡£
3¡¢»Ã¶Á£ºÏµÍ³¹ÜÀíÔ±A½«Êý¾Ý¿âÖÐËùÓÐѧÉúµÄ³É¼¨´Ó¾ßÌå·ÖÊý¸ÄΪABCDEµÈ¼¶£¬µ«ÊÇϵͳ¹ÜÀíÔ±B¾ÍÔÚÕâ¸öʱºò²åÈëÁËÒ»Ìõ¾ßÌå·ÖÊýµÄ¼Ç¼£¬µ±ÏµÍ³¹ÜÀíÔ±A¸Ä½áÊøºó·¢ÏÖ»¹ÓÐÒ»Ìõ¼Ç¼ûÓиĹýÀ´£¬¾ÍºÃÏñ·¢ÉúÁ˻þõÒ»Ñù£¬Õâ¾Í½Ð»Ã¶Á¡£
С½á£º²»¿ÉÖØ¸´¶ÁµÄºÍ»Ã¶ÁºÜÈÝÒ×»ìÏý£¬²»¿ÉÖØ¸´¶Á²àÖØÓÚÐ޸ģ¬»Ã¶Á²àÖØÓÚÐÂÔö»òɾ³ý¡£½â¾ö²»¿ÉÖØ¸´¶ÁµÄÎÊÌâÖ»ÐèËø×¡Âú×ãÌõ¼þµÄÐУ¬½â¾ö»Ã¶ÁÐèÒªËø±í
Èý¡¢MySQLÊÂÎñ¸ôÀë¼¶±ð

mysqlĬÈϵÄÊÂÎñ¸ôÀë¼¶±ðΪrepeatable-read

ËÄ¡¢ÓÃÀý×Ó˵Ã÷¸÷¸ö¸ôÀë¼¶±ðµÄÇé¿ö
1¡¢¶ÁδÌá½»£º
£¨1£©´ò¿ªÒ»¸ö¿Í»§¶ËA£¬²¢ÉèÖõ±Ç°ÊÂÎñģʽΪread uncommitted£¨Î´Ìá½»¶Á£©£¬²éѯ±íaccountµÄ³õʼֵ£º

£¨2£©ÔÚ¿Í»§¶ËAµÄÊÂÎñÌύ֮ǰ£¬´ò¿ªÁíÒ»¸ö¿Í»§¶ËB£¬¸üбíaccount£º

£¨3£©Õâʱ£¬ËäÈ»¿Í»§¶ËBµÄÊÂÎñ»¹Ã»Ìá½»£¬µ«Êǿͻ§¶ËA¾Í¿ÉÒÔ²éѯµ½BÒѾ¸üеÄÊý¾Ý£º

£¨4£©Ò»µ©¿Í»§¶ËBµÄÊÂÎñÒòΪijÖÖÔÒò»Ø¹ö£¬ËùÓеIJÙ×÷¶¼½«»á±»³·Ïú£¬Äǿͻ§¶ËA²éѯµ½µÄÊý¾ÝÆäʵ¾ÍÊÇÔàÊý¾Ý£º

£¨5£©ÔÚ¿Í»§¶ËAÖ´ÐиüÐÂÓï¾äupdate account set balance = balance
- 50 where id =1£¬lileiµÄbalanceûÓбä³É350£¬¾ÓÈ»ÊÇ400£¬ÊDz»ÊÇºÜÆæ¹Ö£¬Êý¾Ý²»Ò»Ö°¡£¬Èç¹ûÄãÕâôÏë¾ÍÌ«ÌìÕæ
ÁË£¬ÔÚÓ¦ÓóÌÐòÖУ¬ÎÒÃÇ»áÓÃ400-50=350£¬²¢²»ÖªµÀÆäËû»á»°»Ø¹öÁË£¬ÒªÏë½â¾öÕâ¸öÎÊÌâ¿ÉÒÔ²ÉÓöÁÒÑÌá½»µÄ¸ôÀë¼¶±ð

2¡¢¶ÁÒÑÌá½»
£¨1£©´ò¿ªÒ»¸ö¿Í»§¶ËA£¬²¢ÉèÖõ±Ç°ÊÂÎñģʽΪread committed£¨Î´Ìá½»¶Á£©£¬²éѯ±íaccountµÄËùÓмǼ£º

£¨2£©ÔÚ¿Í»§¶ËAµÄÊÂÎñÌύ֮ǰ£¬´ò¿ªÁíÒ»¸ö¿Í»§¶ËB£¬¸üбíaccount£º

£¨3£©Õâʱ£¬¿Í»§¶ËBµÄÊÂÎñ»¹Ã»Ìá½»£¬¿Í»§¶ËA²»Äܲéѯµ½BÒѾ¸üеÄÊý¾Ý£¬½â¾öÁËÔà¶ÁÎÊÌ⣺

£¨4£©¿Í»§¶ËBµÄÊÂÎñÌá½»

£¨5£©¿Í»§¶ËAÖ´ÐÐÓëÉÏÒ»²½ÏàͬµÄ²éѯ£¬½á¹û ÓëÉÏÒ»²½²»Ò»Ö£¬¼´²úÉúÁ˲»¿ÉÖØ¸´¶ÁµÄÎÊÌâ

3¡¢¿ÉÖØ¸´¶Á
£¨1£©´ò¿ªÒ»¸ö¿Í»§¶ËA£¬²¢ÉèÖõ±Ç°ÊÂÎñģʽΪrepeatable read£¬²éѯ±íaccountµÄËùÓмǼ

£¨2£©ÔÚ¿Í»§¶ËAµÄÊÂÎñÌύ֮ǰ£¬´ò¿ªÁíÒ»¸ö¿Í»§¶ËB£¬¸üбíaccount²¢Ìá½»

£¨3£©ÔÚ¿Í»§¶ËA²éѯ±íaccountµÄËùÓмǼ£¬Óë²½Ö裨1£©²éѯ½á¹ûÒ»Ö£¬Ã»ÓгöÏÖ²»¿ÉÖØ¸´¶ÁµÄÎÊÌâ

£¨4£©ÔÚ¿Í»§¶ËA£¬½Ó×ÅÖ´ÐÐupdate balance = balance
- 50 where id = 1£¬balanceûÓбä³É400-50=350£¬lileiµÄbalanceÖµÓõÄÊDz½Ö裨2£©ÖеÄ350À´ËãµÄ£¬ËùÒÔÊÇ300£¬Êý¾ÝµÄÒ»ÖÂÐÔµ¹ÊÇûÓб»ÆÆ»µ¡£¿ÉÖØ¸´¶ÁµÄ¸ôÀë¼¶±ðÏÂʹÓÃÁËMVCC»úÖÆ£¬select²Ù×÷²»»á¸üа汾ºÅ£¬ÊÇ¿ìÕÕ¶Á£¨ÀúÊ·°æ±¾£©£»insert¡¢updateºÍdelete»á¸üа汾ºÅ£¬Êǵ±Ç°¶Á£¨µ±Ç°°æ±¾£©¡£

£¨5£©ÖØÐ´ò¿ª¿Í»§¶ËB£¬²åÈëÒ»ÌõÐÂÊý¾ÝºóÌá½»

£¨6£©ÔÚ¿Í»§¶ËA²éѯ±íaccountµÄËùÓмǼ£¬Ã»ÓÐ ²é³ö ÐÂÔöÊý¾Ý£¬ËùÒÔûÓгöÏֻöÁ

4.´®Ðл¯
£¨1£©´ò¿ªÒ»¸ö¿Í»§¶ËA£¬²¢ÉèÖõ±Ç°ÊÂÎñģʽΪserializable£¬²éѯ±íaccountµÄ³õʼֵ£º
mysql> set
session transaction isolation level serializable;
Query OK, 0 rows affected (0.00 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from account;
+------+--------+---------+
| id | name | balance |
+------+--------+---------+
| 1 | lilei | 10000 |
| 2 | hanmei | 10000 |
| 3 | lucy | 10000 |
| 4 | lily | 10000 |
+------+--------+---------+
4 rows in set (0.00 sec)
|
(2£©´ò¿ªÒ»¸ö¿Í»§¶ËB£¬²¢ÉèÖõ±Ç°ÊÂÎñģʽΪserializable£¬²åÈëÒ»Ìõ¼Ç¼±¨´í£¬±í±»ËøÁ˲åÈëʧ°Ü£¬mysqlÖÐÊÂÎñ¸ôÀë¼¶±ðΪserializableʱ»áËø±í£¬Òò´Ë²»»á³öÏֻöÁµÄÇé¿ö£¬ÕâÖÖ¸ôÀë¼¶±ð²¢·¢ÐÔ¼«µÍ£¬¿ª·¢ÖкÜÉÙ»áÓõ½¡£
mysql> set
session transaction isolation level serializable;
Query OK, 0 rows affected (0.00 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into account values(5,'tom',0);
ERROR 1205 (HY000): Lock wait timeout exceeded;
try restarting transaction
|
²¹³ä£º
1¡¢ÊÂÎñ¸ôÀë¼¶±ðΪ¶ÁÌύʱ£¬Ð´Êý¾ÝÖ»»áËø×¡ÏàÓ¦µÄÐÐ
2¡¢ÊÂÎñ¸ôÀë¼¶±ðΪ¿ÉÖØ¸´¶Áʱ£¬Èç¹û¼ìË÷Ìõ¼þÓÐË÷Òý£¨°üÀ¨Ö÷¼üË÷Òý£©µÄʱºò£¬Ä¬ÈϼÓËø·½Ê½ÊÇnext-key
Ëø£»Èç¹û¼ìË÷Ìõ¼þûÓÐË÷Òý£¬¸üÐÂÊý¾Ýʱ»áËø×¡ÕûÕÅ±í¡£Ò»¸ö¼ä϶±»ÊÂÎñ¼ÓÁËËø£¬ÆäËûÊÂÎñÊDz»ÄÜÔÚÕâ¸ö¼ä϶²åÈë¼Ç¼µÄ£¬ÕâÑù¿ÉÒÔ·ÀÖ¹»Ã¶Á¡£
3¡¢ÊÂÎñ¸ôÀë¼¶±ðΪ´®Ðл¯Ê±£¬¶ÁдÊý¾Ý¶¼»áËø×¡ÕûÕűí
4¡¢¸ôÀë¼¶±ðÔ½¸ß£¬Ô½Äܱ£Ö¤Êý¾ÝµÄÍêÕûÐÔºÍÒ»ÖÂÐÔ£¬µ«ÊǶԲ¢·¢ÐÔÄܵÄÓ°ÏìÒ²Ô½´ó¡£
|