一 简介:今天咱来聊聊一个死锁问题的场景
二 原理
请记住这张图,熟记这张图对于大部分死锁场景都能熟练掌握
说明 横向是已经持有的锁,纵向是正在请求的锁。
三 具体案例
事务1 delete from table1 where date='2017-02-03'
insert into table1(date) values('2017-02-03');
事务2 delete from table1 where date='2017-02-04'
insert table1(date) values('2017-02-04');
其中date为普通索引
四 具体分析
经过上图锁原理图,我们知道两个delete所加的是 gap 锁,正好双方的事务接下来都是insert操作,两个事务的delete的gap锁定区间分别就是对方insert的插入区域,理所当然的造成了死锁
五 建议
1 将delete和insert拆分成2个事务
2 尽量避免DML操作对象为普通索引