MySQL死锁场景实例分析(mysql,开发技术)

时间:2024-05-03 19:55:51 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    MySQL%E6%AD%BB%E9%94%81%E5%9C%BA%E6%99%AF%E5%AE%9E%E4%BE%8B%E5%88%86%E6%9E%90

session1

session2

begin;

begin;

select * from dl where a=1 for update;…1 row in set (0.00 sec)

select * from dl where a=2 for update;…1 row in set (0.00 sec)

select * from dl where a=2 for update;/* SQL1 */(等待)

(session2 提示死锁回滚后,SQL1 成功返回结构)

select * from dl where a=1 for update;ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

commit;

commit;

session1 在等待 session2 释放 a=2 的行锁,而 session2 在等待 session1 释放 a=1 的行锁。两个 session 互相等待对方释放资源,就进入了死锁状态。

session1

session2

begin;

begin;

select * from dl where a=1 for update; … 1 row in set (0.00 sec)

select * from dl_1 where a=1 for update; … 1 row in set (0.00 sec)

select * from dl_1 where a=1 for update;/* SQL2 */ 等待

(session2 提示死锁回滚后,SQL1 成功返回结构)

select * from dl where a=1 for update; ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

commit;

commit;

这个实验也是两个 session 互相等待对方释放资源,就进入了死锁状态。

session1

session2

set session transaction_isolation='REPEATABLE-READ'; /* 设置会话隔离级别为 RR */

set session transaction_isolation='REPEATABLE-READ'; /* 设置会话隔离级别为 RR */

begin;

begin;

select * from dl where a=1 for update; … 1 row in set (0.00 sec)

select * from dl where a=2 for update; … 1 row in set (0.00 sec)

insert into dl(a,b,c) values (2,3,3);/* SQL1 */ 等待

(session2 提示死锁回滚后,SQL1 成功返回结果)

insert into dl(a,b,c) values (1,4,4);/* SQL2 */ ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

commit;

commit;

由于 RR 隔离级别下存在间隙锁,可以知道 SQL1 需要等待 a=2 获得的间隙锁,而 SQL2 需要等待 a=1 获得的间隙锁,两个 session 互相等待对方释放资源,就进入了死锁状态。

session1

session2

session3

begin;

insert into dl_insert(a,b,c) value (3,3,3);

insert into dl_insert(a,b,c) value (3,3,3);/* 等待 */

insert into dl_insert(a,b,c) value (3,3,3);/* 等待 */

rollback;

执行成功

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

这里需要注意的是,a 字段有唯一索引。当 session1 执行完 insert 语句,会在索引 a=3 上加记录锁,当 session2 执行同样的 insert 语句时,唯一键冲突,加上读锁;同样 session3 也会加上读锁。

当 session1 回滚,session2 和 session3 都试图继续执行插入操作,都要加上写锁。此时两个 session 都要等待对方的行锁,因此出现了死锁。

一些死锁场景就介绍到这里,当然,也欢迎各位补充其他的一些死锁场景。

本文:MySQL死锁场景实例分析的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Vue3的响应式原理是什么下一篇:

22 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18