使用文字描述就是,當(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è)信息哦~