死锁是指多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。
1、场景:
- 事务1:先更新id为1的数据;再更新id为2的数据
- 事务2:先更新id为2的数据;再更新id为1的数据
这样的话,如果事务1更新了id为1的数据,就相当于给该条记录加锁,其他事务不能对其更新,
此时事务2恰好也更新了id为2的数据,也自动对其加了锁。这样两个事务都无法继续自己的第二条语句,相互卡死
2、解决方案
通常很多的死锁都是程序处理的自身逻辑有问题,可以做一些规范:
- 不同的业务并发访问多个表时,应约定 以相同的顺序访问这些表
- 在同一个事务中,尽可能做到 一次锁定所需要的所有资源,减少死锁产生概率;
- 升级锁定颗粒度,通过 表级锁 定来减少死锁产生的概率。