国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

MySQL中InnoDB的間隙鎖問題

2024-07-24 12:45:50
字體:
來源:轉載
供稿:網友

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

mysql> SHOW CREATE TABLE preferences /G*************************** 1. row *************************** Table: preferencesCreate Table: CREATE TABLE `preferences` ( `numericId` int(10) unsigned NOT NULL, `receiveNotifications` tinyint(1) DEFAULT NULL, PRIMARY KEY (`numericId`)) ENGINE=InnoDB DEFAULT CHARSET=latin11 row in set (0.00 sec)mysql> BEGIN;Query OK, 0 rows affected (0.00 sec)mysql> SELECT COUNT(*) FROM preferences;+----------+| COUNT(*) |+----------+| 0 |+----------+1 row in set (0.01 sec)mysql> UPDATE preferences SET receiveNotifications='1' WHERE numericId = '2';Query OK, 0 rows affected (0.01 sec)Rows matched: 0 Changed: 0 Warnings: 0
InnoDB狀態顯示這個UPDATE在主索引記錄上持有了一個X鎖:
 
---TRANSACTION 4A18101, ACTIVE 12 sec2 lock struct(s), heap size 376, 1 row lock(s)MySQL thread id 3, OS thread handle 0x7ff2200cd700, query id 35 localhost msandboxTrx read view will not see trx with id >= 4A18102, sees < 4A18102TABLE LOCK table `test`.`preferences` trx id 4A18101 lock mode IXRECORD LOCKS space id 31766 page no 3 n bits 72 index `PRIMARY` of table `test`.`preferences` trx id 4A18101 lock_mode X


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

mysql1> BEGIN;Query OK, 0 rows affected (0.00 sec)mysql1> UPDATE preferences SET receiveNotifications='1' WHERE numericId = '1';Query OK, 0 rows affected (0.00 sec)Rows matched: 0 Changed: 0 Warnings: 0mysql2> BEGIN;Query OK, 0 rows affected (0.00 sec)mysql2> UPDATE preferences SET receiveNotifications='1' WHERE numericId = '2';Query OK, 0 rows affected (0.00 sec)Rows matched: 0 Changed: 0 Warnings: 0mysql1> INSERT INTO preferences (numericId, receiveNotifications) VALUES ('1', '1'); -- This one goes into LOCK WAITmysql2> INSERT INTO preferences (numericId, receiveNotifications) VALUES ('2', '1');ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

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

您可能感興趣的文章:

MySQL的InnoDB引擎入門學習教程MySQL存儲引擎中的MyISAM和InnoDB區別詳解Mysql存儲引擎InnoDB和Myisam的六大區別MySQL數據庫InnoDB引擎主從復制同步經驗總結mysql事件的開啟和調用如何開啟mysql中的嚴格模式MySQL提示The InnoDB feature is disabled需要開啟InnoDB的解決方法
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 庆阳市| 汉源县| 玉树县| 新田县| 甘泉县| 安丘市| 师宗县| 甘谷县| 瓦房店市| 岳阳市| 鄂尔多斯市| 达尔| 河南省| 阜平县| 南开区| 台前县| 台东县| 新密市| 宝鸡市| 四子王旗| 汤阴县| 焉耆| 行唐县| 防城港市| 曲麻莱县| 呼伦贝尔市| 牡丹江市| 利川市| 汕尾市| 思南县| 蒲江县| 湘乡市| 盐山县| 武宣县| 巴林右旗| 清河县| 宜都市| 定西市| 个旧市| 博客| 新营市|