數(shù)據(jù)變更注意事項(xiàng)- 2 insert 導(dǎo)致的死鎖

使用文字描述就是,當(dāng)前有三個(gè)事務(wù)在執(zhí)行:

假設(shè)有表:

CREATE TABLE t20 (
  uid INT NOT NULL AUTO_INCREMENT,
  login_name VARCHAR(45) NOT NULL,
  age VARCHAR(45) NULL,
  PRIMARY KEY (uid), 
  UNIQUE INDEX `login_name_UNIQUE` (login_name ASC)
);

事務(wù)A:
嘗試插入一條記錄(null,'neco', 18),此時(shí)事務(wù)A加上寫鎖

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t20 values (null, 'neco', 18);
Query OK, 1 row affected (0.00 sec)

事務(wù)B:
同樣嘗試插入一條記錄(null,'neco', 18),因?yàn)閘ogin_name字段是唯一索引的,所以此時(shí)事務(wù)B會(huì)加上讀鎖

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t20 values (null, 'neco', 18);

事務(wù)C:
同樣嘗試插入一條記錄(null,'neco', 18),因?yàn)閘ogin_name字段是唯一索引的,所以此時(shí)事務(wù)C會(huì)加上讀鎖

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t20 values (null, 'neco', 18);

此時(shí)如果事務(wù)A因?yàn)橐恍﹩?wèn)題,rollback了,那么會(huì)出現(xiàn)以下的情況。
事務(wù)A釋放寫鎖,事務(wù)B想要加上寫鎖的話,需要事務(wù)C釋放讀鎖,但是事務(wù)C需要獲取寫鎖才會(huì)釋放讀鎖,此時(shí)事務(wù)B和事務(wù)C互相等待,就導(dǎo)致了死鎖的誕生。

事務(wù)A:

mysql> rollback;
Query OK, 0 rows affected (0.37 sec)

事務(wù)B:

mysql> insert into t20 values (null, 'neco', 18);
Query OK, 1 row affected (42.00 sec)

事務(wù)C:

mysql> insert into t20 values (null, 'neco', 18);
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

擴(kuò)展 知識(shí)點(diǎn) on duplicate key update

相關(guān)文章:https://juejin.cn/post/7093504329855959048


如果覺得有收獲就點(diǎn)個(gè)贊吧,更多知識(shí),請(qǐng)點(diǎn)擊關(guān)注查看我的主頁(yè)信息哦~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容