æ¾ÂÂé¦ÂÃ¥ÂÂäºÂå ¬ä¼Âå·ãÂÂçÂÂç¹代ç ÂÃ¥ÂÂä¸ÂçÂÂãÂÂï¼Â欢è¿Â堳注ãÂÂ
Ã¥ÂÂæÂÂï¼Âç¾Âå¢é¢è¯Âå®Âï¼ÂMySQLå¯éÂÂå¤Â读å¦Âä½Â解å³幻读ï¼Â
âÂÂå ¨æÂÂ報计4427Ã¥ÂÂï¼Âé¢Â计é 读æ¶é´6Ã¥ÂÂéÂÂ
大家好ï¼ÂæÂÂæ¯*tin*ï¼Âè¿Âæ¯æÂÂçÂÂ第27ç¯ÂÃ¥ÂÂÃ¥ÂÂæÂÂç«Â
âÂÂ
***幻读ï¼Âphantom readï¼ ********ï¼Âæ¯æÂÂå¨ä¸Â个äºÂå¡ä¸ÂÃ¥ÂÂÃ¥ÂÂ两次ç¸åÂÂçÂÂæ¥询产çÂÂä¸ÂÃ¥ÂÂçÂÂç»ÂæÂÂéÂÂï¼ÂÃ¥ÂÂä¸Â次æ¥询çÂÂå°äºÂÃ¥ÂÂä¸Â次æ¥询没æÂÂçÂÂå°çÂÂè®°å½Âè¡ÂãÂÂ
MySQL InnoDBé»Â认çÂÂäºÂå¡éÂÂ离级å«æ¯å¯éÂÂå¤Â读ï¼Âå¯éÂÂå¤Â读çÂÂè¦Âæ¨å¨äºÂÃ¥ÂÂä¸Âæ°æ®è¡Âè®°å½Âå¨ä¸Â个äºÂå¡å æ 论ä½Âæ¶æ¥询ç»ÂæÂÂé½æ¯ä¸Âæ ·çÂÂãÂÂ
ä»Âå®Âä¹Âå¯以çÂ¥éÂÂï¼Âå¯éÂÂå¤Â读解å³çÂÂé®é¢ÂÃ¥ÂÂ幻读é®é¢ÂæÂÂå®Âè´¨æ§çÂÂåºå«ï¼Âä¸Â个éÂÂ对åÂÂä¸Âè¡Âè®°å½Âï¼Âä¸Â个说çÂÂæ¯æ°æ®è¡Âæ°ï¼Âé£ä¹Âï¼ÂMySQLÃ¥ÂÂæ¯æÂÂä¹Â解å³幻读é®é¢ÂçÂÂå¢ï¼Âä»Â天就æÂ¥ä¸Âæ¢究ç«Âï¼Âå Âä¸Âä¸Â个ç®å½Âï¼Â
ä¸ÂãÂÂMySQLå¦Âä½Â解å³幻读
1.1 快砧读åÂÂå½ÂÃ¥ÂÂ读
1.2 快砧读å¦Âä½Â解å³幻读
1.3 å½ÂÃ¥ÂÂ读å¦Âä½Â解å³幻读
äºÂãÂÂå¯éÂÂå¤Â读å®Â堨解å³幻读äºÂä¹Âï¼Â
2.1 é²Â为人çÂ¥çÂÂ幻读
ä¸ÂãÂÂç»Âè¯Â
ä¸ÂãÂÂMySQLå¦Âä½Â解å³幻读
é¦Âå Âï¼ÂæÂÂ们çÂÂÃ¥ÂÂæÂÂæ¯å¨MySQLæ°æ®åºÂå ï¼Â使ç¨çÂÂå¼ÂæÂÂæ¯InnoDBå¼ÂæÂÂï¼Âä¸ÂäºÂå¡çÂÂéÂÂ离级å«æ¯å¯éÂÂå¤Â读ãÂÂ
Ã¥ÂÂé¢æÂÂç« æÂÂ讲è¿Âï¼ÂMySQL InnoDBä¾Âé MVCCå®Âç°äºÂå¡éÂÂ离级å«ãÂÂMVCCÃ¥ÂÂ称å¤ÂçÂÂæ¬并åÂÂæ§å¶ï¼Âå®ÂçÂÂ堨称æ¯Multi-Version Concurrency Controlï¼Âç´ç½说就æ¯å¨åÂÂä¸Âæ¶åÂȌÂÂä¸Âæ¡记å½Âå¨系ç»Âä¸Âå¯以åÂÂå¨å¤Â个çÂÂæ‹ÂÂ
å¦ÂæÂÂä¸Âè®°å¾ÂMVCCï¼Âå¯以ç¹åÂȍÂÂè¿ÂéÂÂï¼Âç¾Âå¢é¢è¯Âå®Âï¼Âå¯éÂÂå¤Â读éÂÂ离级å«å®Âç°åÂÂçÂÂæ¯ä»Âä¹Âï¼Âï¼Âä¸ÂæÂÂæÂÂæÂÂMVCCæºå¶ï¼Â
1.1 快砧读åÂÂå½ÂÃ¥ÂÂ读
å½ÂÃ¥ÂÂ读@MySQLçÂÂMVCCå³å®ÂäºÂÃ¥ÂÂä¸Âæ°æ®è¡Âå¯è½ä¼ÂÃ¥ÂÂæ¶åÂÂå¨å¤Â个çÂÂæÂÂæ åÂ括Âå½ÂÃ¥ÂÂ读表示读åÂÂçÂÂè®°å½Âæ¯æÂÂæ°çÂÂæÂÂï¼Âä¸Â读åÂÂçÂÂæ¶åÂÂï¼Âå¦ÂæÂÂæÂÂå ¶ä»Â并åÂÂäºÂå¡è¦Âä¿®æ¹åÂÂä¸Âæ°æ®è¡Âï¼Âå½ÂÃ¥ÂÂäºÂå¡ä¼ÂéÂÂè¿Âå éÂÂ让堶ä»ÂäºÂå¡é»å¡ÂçÂÂå¾ ãÂÂ
æ¯Âå¦Âselectàlock inàshare mode(報享éÂÂ)ãÂÂselectàfor updateàãÂÂupdateãÂÂinsertàãÂÂdelete(æÂÂä»ÂéÂÂ)çÂÂæÂÂä½Âé½æ¯ä¸Âç§Âå½ÂÃ¥ÂÂ读ï¼Âè¿ÂäºÂæÂÂä½Âä¼Â对读åÂÂçÂÂè®°å½Âè¿Âè¡Âå éÂÂãÂÂ
快砧读@表示ä¸Âå éÂÂçÂÂéÂÂé»å¡Â读ï¼ÂÃ¥ÂÂæ®éÂÂçÂÂselectæÂÂä½Âå°±æ¯快砧读ãÂÂ快砧读çÂÂå®Âç°åºäºÂMVCCï¼Âå®Âå®Âç°äºÂäºÂå¡å 任ä½Âæ¶å»读åÂÂçÂÂæ°æ®é½æ¯åÂÂå²æÂÂ个çÂÂæÂÂæ°æ®ï¼Âä¸Âä¸Âå®Âæ¯å½ÂÃ¥ÂÂæ¶åÂȾÂÂæ°çÂÂæ°æ®ãÂÂ
MVCCè¿Âç§Âå®Âç°æ¹å¼Âä¹Âæ¯ä¸Âç§ÂéÂÂçÂÂÃ¥ÂÂç§Âï¼Âä½Âå®Âé¿å¼ÂäºÂå éÂÂæÂÂä½Âï¼Â大大éÂÂä½Âç³»ç»ÂçÂÂå¼ÂéÂÂï¼Âä»ÂèÂÂæÂÂé«Âç³»ç»ÂçÂÂæ§è½ãÂÂ
éÂÂè¦Âç¹å«注æÂÂçÂÂæ¯ï¼Â快砧读å¨MySQLçÂÂ串è¡ÂéÂÂ离级å«ä¸Âä¼Âä¸ÂÃ¥ÂÂ为å½ÂÃ¥ÂÂ读ï¼Âå³使æ¯selectæÂÂä½Âä¹Âä¼Âå éÂÂãÂÂ
1.2 快砧读å¦Âä½Â解å³幻读
Ã¥ÂÂå¦ÂæÂÂ们æÂÂä¸Âå¼ è´¦æ·ä½Âé¢Â表bank_balanceï¼Âå ¶ç»ÂæÂÂå¦Âä¸Âï¼ÂéÂÂé¢çÂÂÃ¥ÂÂå§Âæ°æ®è¡ÂæÂÂ9è¡ÂãÂÂ
CREATE TABLE
bank_balance
(ÃÂ
id
int NOT NULL AUTO_INCREMENT,ÃÂ
user_name
varchar(45) NOT NULL COMMENT ‘ç¨æ·åÂÂ’,ÃÂ
balance
int NOT NULL DEFAULT ‘0’ COMMENT ‘ä½Âé¢Âï¼ÂÃ¥ÂÂä½Âï¼Â人æ°Âå¸ÂÃ¥ÂÂï¼Âæ¯Âå¦Â100表示人æ°Âå¸Â1å Âï¼Âé»Â认æ¯0’,ÃÂ
wealth
tinyint NOT NULL DEFAULT ‘0’ COMMENT ‘å¯ÂæÂÂç¨Â度ï¼Â0ï¼Âè´«ç©·ï¼Â1ï¼Âå¯ÂæÂÂ’,àPRIMARY KEY (
id
),ÃÂ UNIQUE KEY
idx_bank_balance_user_name
(user_name
)) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
Ã¥ÂÂå§Âæ°æ®è¡Âï¼Â
mysql> select *from bank_balance;
+—-+———–+———–+——–+
| id | user_name | balance | wealth |
+—-+———–+———–+——–+
| 1 | å°Âå | 0 | 0 |
| 2 | å°Âå  | 300000000 | 0 |
| 3 | Tom | 500 | 0 |
| 4 | Eric | 100 | 0 |
| 5 | AI | 0 | 0 |
| 6 | Alex | 100 | 0 |
| 7 | Max | 100 | 0 |
| 8 | Mike | 100 | 0 |
| 9 | Lyn | 200 | 0 |
+—-+———–+———–+——–+
9 rows in set (0.01 sec)
Ã¥ÂÂ设ç°å¨æÂÂ两个äºÂå¡ï¼ÂäºÂå¡AÃ¥ÂÂäºÂå¡Bï¼ÂÃ¥ÂÂæ¶æÂÂä½Âè¿Âå¼ ä½Âé¢Â表ï¼Â两个äºÂå¡çÂÂæÂÂä½Âæ¶é´线å¦Âä¸Âï¼Â
âÂÂ
äºÂå¡AæÂÂ两次æ¥询ï¼ÂÃ¥ÂÂå«å¨â¢åÂÂâ¤ï¼Âé½æ¯éÂÂç¨ç¸åÂÂçÂÂSQLè¯Âå¥ï¼Âselect * from bank_balance where balance > 0ï¼Âæ®éÂÂselectæ¯ä¸Âç§Â快砧读ï¼Âï¼Âç®çÂÂé½æ¯æ¥询æÂÂæÂÂbalance > 0çÂÂrowsãÂÂ
- â åÂÂâ¡ï¼Âå¼Âå¯äºÂå¡ãÂÂ
- â¢ï¼ÂäºÂå¡AéÂÂè¿Âselect * from where balance > 0å¾Âå°çÂÂç»ÂæÂÂæ¯7 Rowsï¼Âå¦Âä¸Âï¼Â
âÂÂ
-
â£ï¼ÂäºÂå¡BæÂÂå ¥ä¸Âè¡Âè®°å½Âà(10, ‘Loop’, 100,0)ãÂÂ
-
â¤ï¼ÂäºÂå¡AéÂÂè¿Âselect * from bank_balance where balance>0Ã¥ÂÂ次æ¥询å¾Âå°çÂÂç»ÂæÂÂï¼ÂÃ¥ÂÂæ ·è¿Âæ¯7 RowsãÂÂ
-
âÂ¥åÂÂâ¦ï¼ÂæÂÂ交äºÂå¡ãÂÂ
为ä»Âä¹Â第â¤å¤Âæ¥询æ¶ç»ÂæÂÂè¿Âæ¯7 Rowså¢ï¼Â大家åºÂ该é½è¿Âè®°å¾ÂMVCCï¼ÂäºÂå¡Aå¨第â¢å¤Âå°±ä¼ÂçÂÂæÂÂä¸Â个ReadViewè®°å½Âå½ÂÃ¥ÂÂçÂÂæ´»è·ÂäºÂå¡ï¼ÂäºÂå¡Bå°±å¨活è·ÂäºÂå¡èÂÂå´å ï¼Âå¨第â¤å¤ÂäºÂå¡B insertçÂÂè®°å½ÂéÂÂèÂÂÃ¥ÂÂäºÂå¡idä¸Â满足äºÂå¡A读åÂÂï¼ÂäºÂå¡Aä¼Â顺çÂÂundo logçÂÂçÂÂ掾æÂ¥å°满足çÂÂè®°å½Â为æ¢ï¼Âå½Âç¶ï¼Â该记å½Âæ¯äºÂå¡Bæ°å¢ÂçÂÂï¼Â顺çÂÂçÂÂ掾æ¾æÂÂç»Âåªè½æ¾å°nullï¼ÂæÂÂ以该记å½Âä¸Âè¿ÂÃ¥ÂÂï¼ÂãÂÂ
1.3àå½ÂÃ¥ÂÂ读å¦Âä½Â解å³幻读
Ã¥ÂÂæ ·æ¯ä¸Âé¢çÂÂ表åÂÂæ¥询æ¶é´线ï¼Âåªæ¯æ¥询è¯Âå¥æ¢æÂÂäºÂå½ÂÃ¥ÂÂ读çÂÂæ¥询select * from bank_balance where balance > 0 for updateï¼ÂÃ¥ÂÂ设没æÂÂéÂÂï¼Âé£ä¹Âå°±ä¼ÂÃ¥ÂÂçÂÂ幻读ç°象ï¼Âå¦Âä¸Âï¼Â
âÂÂ
- â åÂÂâ¡ï¼Âå¼Âå¯äºÂå¡ãÂÂ
- â¢ï¼ÂäºÂå¡AéÂÂè¿Âselect * from bank_balance where balance>0 for updateå¾Âå°çÂÂç»ÂæÂÂæ¯7 Rowsï¼Âå¦Âä¸Âï¼Â
âÂÂ
- â£ï¼ÂäºÂå¡BæÂÂå ¥ä¸Âè¡Âè®°å½Âà(10, ‘Loop’, 100,0)ãÂÂ
- â¤ï¼ÂäºÂå¡AéÂÂè¿Âselect * from bank_balance where balance > 0 for updateÃ¥ÂÂ次æ¥询å¾Âå°çÂÂç»ÂæÂÂæ¯8 Rowsï¼Âå¦Âä¸Âï¼Â
âÂÂ
-
âÂ¥åÂÂâ¦ï¼ÂæÂÂ交äºÂå¡ãÂÂ
第â¢åÂÂ第â¤åÂÂæ ·æ¯æ¥询bank_balance > 0 çÂÂè®°å½Âä½Âå¾Âå°çÂÂç»ÂæÂÂå´ä¸Âä¸Âæ ·ï¼Âè¿Âå°±æ¯幻读ç°象ãÂÂ
为äºÂ解å³幻读é®é¢Âï¼ÂMySQL InnoDB å¼ÂæÂÂå¼Âå ¥äºÂnext-key lockï¼Âå ¶çÂÂÃ¥ÂÂäºÂé´éÂÂéÂÂ+è®°å½ÂéÂÂçÂÂç»ÂÃ¥ÂÂãÂÂ
è®°å½ÂéÂÂï¼Â顾åÂÂæÂÂä¹Âï¼Âå°±æ¯ç»Âæ°æ®è¡Âå çÂÂéÂÂï¼Âé£ä½Â为é´éÂÂéÂÂï¼Â
Ã¥ÂÂ设ï¼Âbank_balance表ä¸ÂåªåÂÂå¨ä½Âé¢Âbalance>0ä¸Â主é®id 为4Ã¥ÂÂ6çÂÂè®°å½Âï¼Âé£ä¹Âå½Âä¸Â个äºÂå¡使ç¨select * from where balance>0 for updateæ¥询æ¶ï¼Âå ¶ä»ÂäºÂå¡就æ æ³ÂæÂÂå ¥ id = 5çÂÂè®°å½Âï¼Âå°±åÂÂæ¯äºÂå¡AæÂÂ(4,6)è¿Â个èÂÂå´éÂÂä½ÂäºÂï¼Âè¿Âå°±æ¯é´éÂÂéÂÂãÂÂ
å¦ÂæÂÂÃ¥ÂÂæÂÂid=4Ã¥ÂÂ6çÂÂè®°å½Âä¹ÂÃ¥ÂÂæ¶ä¸Âèµ·éÂÂäºÂï¼ÂÃ¥ÂÂèµ·æÂ¥åÂÂæÂÂä¸Â个éÂÂåºé´[4, 6]ï¼Âé£ä¹Âæ´个åºé´éÂÂä¹Âå«next-key lockãÂÂ
è¿Âæ¯以ä¸ÂçÂÂä¾ÂÃ¥ÂÂï¼ÂäºÂå¡Bå¨äºÂå¡Aæ¥询åÂÂè¿Âè¡ÂinsertæÂÂä½Âï¼Â
âÂÂ
äºÂå¡ A å¨â¢å¤Âæ§è¡ÂäºÂselect * from bank_balance where balance > 0 for updateè¿Âæ¡éÂÂå®Â读è¯Âå¥åÂÂï¼Âå°±ä¼ÂæÂÂæ´个表æÂÂæÂÂè®°å½ÂéÂÂä¸Â(å 为balanceÃ¥ÂÂ段æ 索å¼Â)ï¼Â并根æ®主é®idÃ¥ÂÂ表记å½Âå½¢æÂÂå¤Â个next-key lockï¼ÂÃ¥ÂÂå«æ¯ï¼Â(-âÂÂ, 1]ãÂÂ(1, 2]ãÂÂ(2, 3]ãÂÂ(3, 4]ãÂÂ(4, 5]ãÂÂ(5, 6]ãÂÂ(6, 7]ãÂÂ(7, 8]ãÂÂ(8, 9]ãÂÂ(9, +âÂÂ]ï¼Âæ¯Â个next-key locké½æ¯åÂÂå¼ÂÃ¥ÂÂéÂÂåºé´ãÂÂ
ç¶åÂÂï¼ÂäºÂå¡ B å¨â£å¤Âæ§è¡ÂæÂÂå ¥è¯Âå¥ï¼ÂÃ¥ÂÂç°id=10被äºÂå¡ A å 亠next-key lockï¼ÂäºÂæ¯äºÂç© B ä¼ÂçÂÂæÂÂä¸Â个åÂÂéÂÂï¼Âå¼Âå§Âé»å¡ÂçÂÂå¾ ï¼Âç´å°äºÂå¡ A æÂÂ交äºÂäºÂå¡æÂÂä¼Âæ§è¡ÂãÂÂè¿Âå°±é¿å ÂäºÂä¸Âè¿°æÂÂ说çÂÂ幻读é®é¢ÂãÂÂ
以ä¸ÂçÂÂä¾ÂÃ¥ÂÂæ¯Âè¾Âç¹æ®Âï¼Âå¦ÂæÂÂæÂÂ们çÂÂ表ä¸ÂåªæÂÂ两æ¡记å½Âï¼ÂÃ¥ÂÂå«æ¯(4, ‘Eric’, 100,0)ãÂÂ(10, ‘Loop’, 100,0)ï¼Âé£ä¹Âå½ÂæÂÂ们æ§è¡Âselect *from bank_balance where id > 8àfor updateæ¶ï¼Âå°±åªä¼Âå½¢æÂÂ两个next-key lockï¼Âå®Âå°±æ¯(4, 10]ï¼Â(10, +âÂÂ]ï¼Âå¦ÂæÂÂæÂÂ们æ§è¡Âinsert into bank_balance values(5,’MALL’,100,0)å°Âä¼Â被é»å¡Âï¼Âä½Âæ¯æÂÂ们æ§è¡Âinsert into bank_balance values(2,’MALL’,100,0)å°±ä¸Âä¼Â被é»å¡Âï¼Âå 为id=2没æÂÂ被éÂÂä½ÂãÂÂ
ç¹å«说æÂÂä¸Âä¸Âï¼Ânext-key lockåºäºÂè®°å½Âå½¢æÂÂï¼Âä¸Âæ¯åºäºÂæ¥询æ¡件形æÂÂï¼ÂæÂÂäºÂÃ¥ÂÂå¦é®å°ä¸ÂæÂÂçÂÂä¾ÂÃ¥ÂÂä¸Â两个next-key lock为ä»Âä¹Âä¸Âæ¯(8, 10]ãÂÂ(10, +âÂÂ]ï¼Âå°±æ¯è¿Â个åÂÂå ãÂÂÃÂ
äºÂãÂÂå¯éÂÂå¤Â读å®Â堨解å³幻读äºÂä¹Â
2.1 é²Â为人çÂ¥çÂÂ幻读
MySQL InnoDBé»Â认çÂÂå¯éÂÂå¤Â读éÂÂ离级å«å ä¸Ânext-key lockä¸Âå®Âç¨Â度ä¸Â解å³äºÂ幻读é®é¢Âï¼Âä½Âä¾Âç¶åÂÂå¨ç¹æ®ÂçÂÂæ åµä¸Â产çÂÂ幻读é®é¢ÂãÂÂ
*第ä¸Âç§Âæ åµ@*å Âå¯å¨çÂÂäºÂå¡A使ç¨快砧读ï¼ÂÃ¥ÂÂå¯å¨çÂÂäºÂå¡BæÂÂå ¥æ°çÂÂæ°æ®è¡Â并æÂÂ交ï¼Âç¶åÂÂäºÂå¡AÃ¥ÂÂæ´æ°ï¼Âå ¶åÂÂAçÂÂæ¥询é½è½æÂ¥äºÂå¡Bæ°å¢ÂçÂÂæ°æ®è¡ÂãÂÂ
âÂÂ
â¢ï¼Â表ä¸Â没æÂÂid=5çÂÂè®°å½Âè¡Âï¼ÂæÂÂ以äºÂå¡Aæ¥询çÂÂç»ÂæÂÂæ¯0RowsãÂÂ
â£-âÂ¥ï¼ÂäºÂå¡Bå¯å¨ï¼Â并æÂÂå ¥ä¸Âæ¡id=5çÂÂè®°å½Âï¼ÂÃ¥ÂÂæÂÂ交äºÂå¡ãÂÂ
â¦ï¼ÂäºÂå¡Aæ´æ°id=5çÂÂè®°å½ÂãÂÂ
â§ï¼ÂäºÂå¡Aæ¥询id=5çÂÂè®°å½Âï¼Âç»ÂæÂÂRows=1ï¼Â产çÂÂäºÂ幻读ãÂÂ
æÂÂMVCCçÂÂÃ¥ÂÂçÂÂï¼Â第â§å¤ÂäºÂå¡Aæ¥询ç»ÂæÂÂä¸ÂåºÂ该è¿ÂÃ¥ÂÂid=5çÂÂè®°å½Âï¼Âä½Âå 为æÂÂupdateå¨å Âï¼ÂæÂÂ以该记å½ÂèÂÂæ¥询äºÂåºæÂ¥ãÂÂï¼Âæ¤å¤Âå¾Âç»Âï¼ÂéÂÂè¦Â认çÂÂçÂÂä¸ÂçÂÂè¿Â个æÂÂç« æÂÂè½çÂÂ解ï¼Âç¾Âå¢é¢è¯Âå®Âï¼Âå¯éÂÂå¤Â读éÂÂ离级å«å®Âç°åÂÂçÂÂæ¯ä»Âä¹Âï¼Âï¼Âä¸ÂæÂÂæÂÂæÂÂMVCCæºå¶ï¼Âï¼Â
快砧读ä¸Âä¼Âå éÂÂï¼Â导è´äºÂå¡Bå¯以insertæÂÂÃ¥ÂÂï¼ÂèÂÂupdateè¯Âå¥åÂÂæ¯å½ÂÃ¥ÂÂ读ï¼Âè½å¤Âæ´æ°id=5çÂÂæ°æ®ï¼ÂæÂÂ以ï¼Âå½Âæ§è¡Ââ§æ¶ï¼Â快砧读ä¹Âå°±è½å¤Âæ¥询åºæÂÂ¥id=5çÂÂè®°å½ÂäºÂãÂÂ
*第äºÂç§Âæ åµ@*å¦ÂæÂÂäºÂå¡ä¸Âå¼Âå§Â没æÂÂ使ç¨å½ÂÃ¥ÂÂ读ï¼Âå½Âå ¶ä»ÂäºÂå¡æÂÂå ¥æ°æ®并æÂÂ交åÂÂÃ¥ÂÂ使ç¨å½ÂÃ¥ÂÂ读就ä¼ÂÃ¥ÂÂçÂÂ幻读ç°象ãÂÂ
âÂÂ
â¢ï¼Â表ä¸Â没æÂÂid=5çÂÂè®°å½Âè¡Âï¼ÂæÂÂ以äºÂå¡AéÂÂç¨快砧读æ¹å¼Âæ¥询çÂÂç»ÂæÂÂæ¯0RowsãÂÂ
â£-âÂ¥ï¼ÂäºÂå¡Bå¯å¨ï¼Â并æÂÂå ¥ä¸Âæ¡id=5çÂÂè®°å½Âï¼ÂÃ¥ÂÂæÂÂ交äºÂå¡ãÂÂ
â¦ï¼ÂäºÂå¡AéÂÂç¨å½ÂÃ¥ÂÂ读çÂÂæ¹å¼Âæ¥询id=5çÂÂè¡Âï¼Âç»ÂæÂÂRows为1ï¼Â产çÂÂäºÂ幻读ãÂÂ
è¿Âç§Âæ åµæ¯å 为快砧读ä¸ÂçÂÂæÂÂnext-key lock导è´ï¼Âå ¶ä»ÂäºÂå¡å¯以æÂÂå ¥æ¬äºÂå¡æ¥询èÂÂå´å çÂÂè®°å½Âè¡Âï¼ÂæÂÂ以ï¼Âå½Âå ¶ä»ÂäºÂå¡æÂÂå ¥æ°æ®åÂÂÃ¥ÂÂæ§è¡Âå½ÂÃ¥ÂÂ读ï¼Âå°±è½æÂ¥å°æ°çÂÂè®°å½Âï¼Âä»ÂèÂÂ产çÂÂ幻读é®é¢ÂãÂÂ
ä¸Âèάå¼ÂÃ¥ÂÂè¿Âç¨Âä¸Â建议å¼Âå¯ä¸Â个äºÂå¡æ¶尽快éÂÂç¨for updateçÂÂæ¥询æ¹å¼Âï¼Â以çÂÂæÂÂnext-key lockï¼Âé¿å Â幻读é®é¢ÂãÂÂ
ä¸ÂãÂÂç»Âè¯Â
æÂÂæ¯tinï¼Âä¸Â个å¨åªåÂÂ让èª己åÂÂå¾Âæ´ä¼Âç§ÂçÂÂæ®éÂÂå·¥ç¨Âå¸ÂãÂÂèª己é åÂÂæÂÂéÂÂãÂÂå¦è¯Âæµ èÂÂï¼Âå¦ÂæÂÂÃ¥ÂÂç°æÂÂç« ä¸Â妥ä¹Âå¤Âï¼ÂéÂÂ常欢è¿Âå æÂÂæÂÂåºï¼ÂæÂÂä¸Âå®Âç»Âå¿Âæ¨æ²并å 以修æ¹ãÂÂ
çÂÂå°è¿ÂéÂÂ请å®ÂæÂÂ个âÂÂä¸Âè¿ÂâÂÂï¼ÂÃ¥ÂÂ享ãÂÂç¹èµÂãÂÂå¨çÂÂï¼ÂÃ¥ÂÂèµ°å§ï¼ÂÃ¥ÂÂæÂÂÃ¥ÂÂä½Âä¸Â容æÂÂï¼Âä½ çÂÂæ£åÂÂé¦Âæ¯æÂÂÃ¥ÂÂæÂÂè¾ÂåºçÂÂæÂÂ强å¨åÂÂï¼Â谢谢ï¼Â
âÂÂ