记录一次mysql数据库的死锁

时间:2023-01-04 08:30:51

最近在工作上碰到了一个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、删除的时候是有区间锁的,举个