mysql 多线程 事务插入数据 死锁, Deadlock found when trying to get lock; try restarting transaction

在多线程环境下,两个事务因争夺锁资源发生死锁。具体场景是,各线程扫描不同数据源,处理后批量插入/更新数据库,导致死锁。例如,事务T1插入IP为224.1.0.3的数据,而事务T2尝试插入IP为224.1.0.2的数据,但T2被T1持有的锁阻塞,反之亦然,造成死锁。提出的解决方案包括:业务数据暂存后合并处理、代码串行化执行。
摘要由CSDN通过智能技术生成

业务执行中遇到错误日志

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.待大神补充.......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值