最近在工作上碰到了一个mysql死锁的问题,纠结了好久,这里和大家分享一下!
现象:
java代码的一个请求可以拆分成两块,先删除employee表的部分数据,后往employee表里面插入部分数据;
如果有两个线程同时进行,有一定几率会发生死锁。
排查过程:
先手动调用接口,发现比较难复现,果断找了DBA要了当时死锁的日志,截取了两段sql:
DELETE FROM employee WHERE id IN ( '10000001' , '10003120' , '10007730' , '10011333' , '10085782' , '10500018' , '10500126' , '10500138' , '10500162' , INSERT INTO employee ( id, name, org_id, state ) VALUES ( 10076481, 'AAA', 41813, 1 ) , ( 10000019, 'BBB', 43057, 1 ) , ( 10003096, 'CCC', 42981, 1 ) ,
日志里面有提到说删除的时候需要找插入的X锁,插入需要找删除的X锁;
我们知道mysql innondb里面:
1、删除的时候是有区间锁的,举个