mysql更新死锁问题

本文探讨了使用ThreadPoolTaskExecutor在高并发环境下更新MySQL(InnoDB引擎)表时遇到的行级锁问题,特别是在对带有唯一键的表进行批量更新时如何避免死锁。文章建议在更新操作中使用主键,以优化锁的获取顺序,从而减少死锁发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在使用ThreadPoolTaskExecutor实现多线程过程中,在对数据表的更新操作时,遇到了行级锁问题,即多个更新的语句同时执行时,出现了因并发导致一条更新占用了该行的锁,导致另一条更新无法获取锁,更新失败。
表结构如下
CREATE TABLE `batch_job_seq` (
  `ID` bigint(20) NOT NULL,
  `UNIQUE_KEY` char(1) NOT NULL,
  UNIQUE KEY `UNIQUE_KEY_UN` (`UNIQUE_KEY`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
查看相关资料发现了一个比较专业的总结,在此做个记录吧,如下:
在采用INNODB的MySQL中,更新操作默认会加行级锁,行级锁是基于索引的,在分析死锁之前需要查询一下mysql的执行计划,看看是否用到了索引,用到了哪个索引,对于没有用索引的操作会采用表级锁。如果操作用到了主键索引会先在主键索引上加锁,然后在其他索引上加锁,否则加锁顺序相反。在并发度高的应用中,批量更新一定要带上记录的主键,优先获取主键上的锁,这样可以减少死锁的发生。

转述:http://ju.outofmemory.cn/entry/199937

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值