日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
一個需要避免的InnoDB間隙鎖

在為一個客戶排除死鎖問題時我遇到了一個有趣的包括InnoDB間隙鎖的情形。對于一個WHERE子句不匹配任何行的非插入的寫操作中,我預(yù)期事務(wù)應(yīng)該不會有鎖,但我錯了。讓我們看一下這張表及示例UPDATE。

伊吾網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,伊吾網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為伊吾上1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的伊吾做網(wǎng)站的公司定做!

 
 
 
  1. mysql> SHOW CREATE TABLE preferences \G 
  2. *************************** 1. row *************************** 
  3.        Table: preferences 
  4. Create Table: CREATE TABLE `preferences` ( 
  5.   `numericId` int(10) unsigned NOT NULL, 
  6.   `receiveNotifications` tinyint(1) DEFAULT NULL, 
  7.   PRIMARY KEY (`numericId`) 
  8. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 
  9. 1 row in set (0.00 sec) 
  10. mysql> BEGIN; 
  11. Query OK, 0 rows affected (0.00 sec) 
  12. mysql> SELECT COUNT(*) FROM preferences; 
  13. +----------+ 
  14. | COUNT(*) | 
  15. +----------+ 
  16. |        0 | 
  17. +----------+ 
  18. 1 row in set (0.01 sec) 
  19. mysql> UPDATE preferences SET receiveNotifications='1' WHERE numericId = '2'; 
  20. Query OK, 0 rows affected (0.01 sec) 
  21. Rows matched: 0  Changed: 0  Warnings: 0 

InnoDB狀態(tài)顯示這個UPDATE在主索引記錄上持有了一個X鎖:

 
 
 
  1. ---TRANSACTION 4A18101, ACTIVE 12 sec 
  2. 2 lock struct(s), heap size 376, 1 row lock(s) 
  3. MySQL thread id 3, OS thread handle 0x7ff2200cd700, query id 35 localhost msandbox 
  4. Trx read view will not see trx with id >= 4A18102, sees < 4A18102 
  5. TABLE LOCK table `test`.`preferences` trx id 4A18101 lock mode IX 
  6. RECORD LOCKS space id 31766 page no 3 n bits 72 index `PRIMARY` of table `test`.`preferences` trx id 4A18101 lock_mode X 

這是為什么呢,Heikki在其bug報告中做了解釋,這很有意義,我知道修復(fù)起來很困難,但略帶厭惡地我又希望它能被差異化處理。為完成這篇文章,讓我證明下上面說到的死鎖情況,下面中mysql1是第一個會話,mysql2是另一個,查詢的順序如下:

 
 
 
  1. mysql1> BEGIN; 
  2. Query OK, 0 rows affected (0.00 sec) 
  3. mysql1> UPDATE preferences SET receiveNotifications='1' WHERE numericId = '1'; 
  4. Query OK, 0 rows affected (0.00 sec) 
  5. Rows matched: 0 Changed: 0 Warnings: 0 
  6. mysql2> BEGIN; 
  7. Query OK, 0 rows affected (0.00 sec) 
  8. mysql2> UPDATE preferences SET receiveNotifications='1' WHERE numericId = '2'; 
  9. Query OK, 0 rows affected (0.00 sec) 
  10. Rows matched: 0 Changed: 0 Warnings: 0 
  11. mysql1> INSERT INTO preferences (numericId, receiveNotifications) VALUES ('1', '1'); -- This one goes into LOCK WAIT 
  12. mysql2> INSERT INTO preferences (numericId, receiveNotifications) VALUES ('2', '1'); 
  13. ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction 

現(xiàn)在你看到導(dǎo)致死鎖是多么的容易,因此一定要避免這種情況——如果來自于事務(wù)的INSERT部分導(dǎo)致非插入的寫操作可能不匹配任何行的話,不要這樣做,使用REPLACE INTO或使用READ-COMMITTED事務(wù)隔離。

原文鏈接:http://www.oschina.net/translate/one-more-innodb-gap-lock-to-avoid


分享文章:一個需要避免的InnoDB間隙鎖
網(wǎng)頁鏈接:http://www.dlmjj.cn/article/dhojpdi.html