业务执行中遇到错误日志
Deadlock found when trying to get lock; try restarting transaction,
分析原因
1.两个Mysql事务争夺锁资源,事务之间相互持有了对方的锁
我的场景如下:多线程 扫描获取不同数据源数据,经过数据处理后,批量根据数据插入/更新数据库数据,整个方法上加了事务,
表结构 ,三个字段 ip ,find_time ,mac,ip字段为索引列
模拟两个事务执行
t1:执行
start transaction;
insert into ip_user (ip,lastfindtime,mac) value
('224.1.0.3', '2023-03-07 11:00:20', '01:00:5e:00:0e:02' )
t2:执行
start transaction;
insert into ip_user (ip,lastfindtime,current,mac) value
('224.1.0.2', '2023-03-07 11:00:20', '01:00:5e:00:00:02')
-- 此时t2获取不到锁,t1在上一条语句时获取了gap lock, 等待t1释放锁
t1:执行
insert into ip_user (ip,lastfindtime,mac) value
('224.1.0.2', '2023-03-07 11:00:20', '01:00:5e:00:00:02' )
-- 到此为止 多个事务插入相同记录,t1已获取了排他锁, t2 事务报错,Deadlock found when trying to get lock;
解决
1.根据业务 多线程执行 暂存业务数据到合适位置 ,多线程执行结束后合并处理
2.对该部分业务代码 处理,串行执行
3.待大神补充.......
在多线程环境下,两个事务因争夺锁资源发生死锁。具体场景是,各线程扫描不同数据源,处理后批量插入/更新数据库,导致死锁。例如,事务T1插入IP为224.1.0.3的数据,而事务T2尝试插入IP为224.1.0.2的数据,但T2被T1持有的锁阻塞,反之亦然,造成死锁。提出的解决方案包括:业务数据暂存后合并处理、代码串行化执行。
1241

被折叠的 条评论
为什么被折叠?



