死锁的产生是因为满足了四个条件:
- 互斥
- 占有且等待
- 不可强占用
- 循环等待
这个网站收集了很多死锁场景
接下来介绍几种常见的死锁发生场景。其中,id 为主键,no(学号)为二级唯一索引,name(姓名)和 age(年龄)为二级非唯一索引,score(学分)无索引。数据库隔离级别为 RR。

多个事务加锁顺序不一致

两条记录锁,X锁,相互再想获取对方的,会卡住
间隙锁之间虽然不会互相阻塞,但插入意向锁会和间隙锁阻塞

事务A和B先后再(20, 30)的区间上加了间隙锁,此时间隙锁之间是没影响的,因为间隙锁主要是为了防止幻读的发生也就是插入的发生。但是A此时有想插入数据了,是需要在(20, 30)内生成插入意向锁的,但这个区间在B的间隙锁范围内,所以就会冲突。B事务的插入同理。形成了死锁。要解决这个死锁很简单,显然,前面两条 UPDATE 语句是无效的,将其删除即可。另外也可以将数据库隔离级别改成 RC,这样在 UPDATE 的时候就不会有间隙锁了。

本文详细分析了死锁的产生原因,涉及互斥占有、循环等待等条件,以及数据库隔离级别如何影响死锁。重点讲解了常见的死锁场景,如事务加锁顺序不一致和范围查找引发的死锁。还介绍了主键索引和唯一二级索引的加锁行为。最后提出了通过设置等待超时和主动死锁检测来解决死锁的方法。

1525

被折叠的 条评论
为什么被折叠?



