mysql更新死锁问题

最近在使用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

你可能感兴趣的:(mysql)