Mysql自增列,并发插入时导致死锁的问题 浅浅的花香味﹌ 2023-10-05 10:41 6阅读 0赞 ### 背景: ### 有一张表需要每天定时迁移数据,采用的SQL如下(表名已调整) ![复制代码][48304ba5e6f9fe08f3fa1abda7d326ab.png] insert into data_cache ( customerID,organizationID,createTime) ( select customerID,organizationID,createTime from data where DATE(createTime) <= DATE(?) and autoIndex >= ? and autoIndex <= ? ) ![复制代码][48304ba5e6f9fe08f3fa1abda7d326ab.png] 大体意思是根据autoIndex去判定那些数据需要迁移,在程序中已经分好区域了 比如1~100,101~200,201~300. 表结构如下: 两张表的数据表结构均一致,如: ![复制代码][48304ba5e6f9fe08f3fa1abda7d326ab.png] CREATE TABLE `data` ( `customerID` varchar(50) NOT NULL COMMENT '客户编号', `organizationID` varchar(50) DEFAULT NULL COMMENT '机构号', `createTime` timestamp NULL DEFAULT current_timestamp() COMMENT '创建时间', `lastModifiedDatetime` timestamp NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT '最近修改时间', `autoIndex` int(11) NOT NULL AUTO_INCREMENT COMMENT '索引', `modifyDate` timestamp NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT '修改日期', PRIMARY KEY (`customerID`), KEY `autoIndex` (`autoIndex`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=468 DEFAULT CHARSET=utf8 ![复制代码][48304ba5e6f9fe08f3fa1abda7d326ab.png] 之前测试环境,甚至生产环境都是正常的代码,最近更新了数据库,出现了死锁异常如下: insert into data_cache ( customerID,organizationID,createTime) ( select customerID,organizationID,createTime from data where DATE(createTime) <= DATE(?) and autoIndex >= ? and autoIndex <= ? ) Deadlock found when trying to get lock; try restarting transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction org.springframework.dao.DeadlockLoserDataAccessException: PreparedStatementCallback; ### 问题: ### Mysql插入居然报了死锁,还是两条插入并发,在数据源没有交集的情况下,并且之前一直是正常。百思不得其解 ### 尝试解决: ### 移除掉缓存表中的autoIndex字段,取消自增以及非空。重试正常。 ### 问题根源: ### 其实真正的问题涉及到Mysql对自增的设计。 详情可以参阅: https://www.cnblogs.com/JiangLe/p/6362770.html 大体就是数据库的模式对这种自增插入有3种设置。原有的环境以及生产为2,更新后改为1导致的。 可以输入以下命令查看设置: show global variables innodb\_autoinc\_lock\_mode 2 因为我们对连续没什么要求,所以采用性能最好的即可 来源:[https://www.cnblogs.com/liangwen/p/9815336.html][https_www.cnblogs.com_liangwen_p_9815336.html] [48304ba5e6f9fe08f3fa1abda7d326ab.png]: https://img-blog.csdnimg.cn/img_convert/48304ba5e6f9fe08f3fa1abda7d326ab.png [https_www.cnblogs.com_liangwen_p_9815336.html]: https://www.cnblogs.com/liangwen/p/9815336.html
相关 并发控制不当导致的Java死锁问题 在Java编程中,死锁是一种常见的并发控制问题。当两个或更多的进程,在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉它们将无法继续执行。 解决死锁问题的关键在 àì夳堔傛蜴生んèń/ 2024年09月10日 03:03/ 0 赞/ 20 阅读
相关 MySQL自增字段并发插入导致死锁 MySQL带自增字段的表在并发插入时发生死锁 问题 'int' object has no attribute 'encode'", <class 'mys 逃离我推掉我的手/ 2023年10月05日 10:41/ 0 赞/ 4 阅读
相关 Mysql自增列,并发插入时导致死锁的问题 背景: 有一张表需要每天定时迁移数据,采用的SQL如下(表名已调整) ![复制代码][48304ba5e6f9fe08f3fa1abda7d326ab.png] 浅浅的花香味﹌/ 2023年10月05日 10:41/ 0 赞/ 7 阅读
相关 mysql并发插入死锁 mysql并发插入死锁 场景 多个线程同时执行条件插入语句 SQL: INSERT INTO system_lock (resource, owner 怼烎@/ 2022年12月22日 08:49/ 0 赞/ 164 阅读
相关 mysql 自增列新增 auto\_increment\_increment 自增步长 auto\_increment\_offset自增初始值 SET @@auto\_increment\_in 迈不过友情╰/ 2022年11月27日 10:14/ 0 赞/ 210 阅读
相关 InnoDB 并发插入,如何使用自增锁和意向锁 并发的任务对同一个临界资源进行操作,如果不采取措施,可能导致不一致,故必须进行并发控制(Concurrency Control)。InnoDB 存储引擎中使用的多种并发控制策略 傷城~/ 2022年03月17日 00:42/ 0 赞/ 144 阅读
相关 解决方案:并发插入引起死锁 项目中使用到了排行榜的功能,由于排行榜需要根据多个指标排名,因此不能通过Redis的zset实现,决定通过数据库实现(存储引擎InnoDB) 有一个接口是为参与者新增排行榜记 妖狐艹你老母/ 2022年01月27日 01:17/ 0 赞/ 223 阅读
相关 Mysql 并发引起的死锁问题 Mysql 并发引起的死锁问题 平台的某个数据库上面有近千个连接,每个连接对应一个爬虫,爬虫将爬来的数据放到[cdb][]里供后期分析查询使用。前段时间经常出现cd 亦凉/ 2021年12月20日 10:59/ 0 赞/ 341 阅读
相关 MySQL死锁导致无法查询 客服反馈后台无法查询,原因大概知道,是因为MySQL的事务产生了死锁,以往都不知道是哪个事务锁住了,只能很粗暴地重启MySQL 最近查找到一个方法,不用重启My 心已赠人/ 2021年06月24日 13:59/ 0 赞/ 457 阅读
还没有评论,来说两句吧...