Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
MySQLµÄËÄÖÖÊÂÎñ¸ôÀë¼¶±ð
 
×÷Õߣº»¨ÅªÓ°
  1785  次浏览      27
2020-7-2 
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Òª½éÉÜÊÂÎñµÄ»ù±¾ÒªËØ£¬ÊÂÎñµÄ²¢·¢ÎÊÌ⣬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¡¢¸ôÀë¼¶±ðÔ½¸ß£¬Ô½Äܱ£Ö¤Êý¾ÝµÄÍêÕûÐÔºÍÒ»ÖÂÐÔ£¬µ«ÊǶԲ¢·¢ÐÔÄܵÄÓ°ÏìÒ²Ô½´ó¡£

 

   
1785 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

»ùÓÚEAµÄÊý¾Ý¿â½¨Ä£
Êý¾ÝÁ÷½¨Ä££¨EAÖ¸ÄÏ£©
¡°Êý¾Ýºþ¡±£º¸ÅÄî¡¢ÌØÕ÷¡¢¼Ü¹¹Óë°¸Àý
ÔÚÏßÉ̳ÇÊý¾Ý¿âϵͳÉè¼Æ ˼·+Ч¹û
 
Ïà¹ØÎĵµ

GreenplumÊý¾Ý¿â»ù´¡Åàѵ
MySQL5.1ÐÔÄÜÓÅ»¯·½°¸
ijµçÉÌÊý¾ÝÖÐ̨¼Ü¹¹Êµ¼ù
MySQL¸ßÀ©Õ¹¼Ü¹¹Éè¼Æ
Ïà¹Ø¿Î³Ì

Êý¾ÝÖÎÀí¡¢Êý¾Ý¼Ü¹¹¼°Êý¾Ý±ê×¼
MongoDBʵս¿Î³Ì
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
PostgreSQLÊý¾Ý¿âʵսÅàѵ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
 
×îÐÂÎÄÕÂ
InfluxDB¸ÅÄîºÍ»ù±¾²Ù×÷
InfluxDB TSM´æ´¢ÒýÇæÖ®Êý¾ÝдÈë
Éî¶ÈÂþ̸Êý¾Ýϵͳ¼Ü¹¹¡ª¡ªLambda architecture
Lambda¼Ü¹¹Êµ¼ù
InfluxDB TSM´æ´¢ÒýÇæÖ®Êý¾Ý¶ÁÈ¡
×îпγÌ
OracleÊý¾Ý¿âÐÔÄÜÓÅ»¯¡¢¼Ü¹¹Éè¼ÆºÍÔËÐÐά»¤
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
NoSQLÊý¾Ý¿â£¨Ô­Àí¡¢Ó¦Óá¢×î¼Ñʵ¼ù£©
ÆóÒµ¼¶Hadoop´óÊý¾Ý´¦Àí×î¼Ñʵ¼ù
OracleÊý¾Ý¿âÐÔÄÜÓÅ»¯×î¼Ñʵ¼ù
³É¹¦°¸Àý
ij½ðÈÚ¹«Ë¾ Mysql¼¯ÈºÓëÐÔÄÜÓÅ»¯
±±¾© ²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
ÖªÃûijÐÅϢͨÐŹ«Ë¾ NoSQL»º´æÊý¾Ý¿â¼¼Êõ
±±¾© oracleÊý¾Ý¿âSQLÓÅ»¯
ÖйúÒÆ¶¯ IaaSÔÆÆ½Ì¨-Ö÷Á÷Êý¾Ý¿â¼°´æ´¢¼¼Êõ