mysql 案例系列 ~ 一个死锁问题的分析

一 简介:今天咱来聊聊一个死锁问题的场景

二 原理

        

    请记住这张图,熟记这张图对于大部分死锁场景都能熟练掌握  

    说明   横向是已经持有的锁,纵向是正在请求的锁。

     

三  具体案例

     事务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操作对象为普通索引

猜你喜欢

转载自www.cnblogs.com/danhuangpai/p/9082788.html