MySQL常见死锁的发生场景以及如何解决

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

死锁的产生是因为满足了四个条件:

  • 互斥
  • 占有且等待
  • 不可强占用
  • 循环等待

这个网站收集了很多死锁场景

接下来介绍几种常见的死锁发生场景。其中,id 为主键,no(学号)为二级唯一索引,name(姓名)和 age(年龄)为二级非唯一索引,score(学分)无索引。数据库隔离级别为 RR。
在这里插入图片描述

多个事务加锁顺序不一致

在这里插入图片描述
两条记录锁,X锁,相互再想获取对方的,会卡住

间隙锁之间虽然不会互相阻塞,但插入意向锁会和间隙锁阻塞

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

忽视范围查找的行锁是一个个加的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值