当我们想要更新一批数据时,是否有过这种操作:
delete(param1,param2)
insert(model)
先删除旧数据,然后再直接插入。 在这里说下我遇到的问题:
found when trying to get lock; try restarting transaction\n; SQL
INSERT tbl (c1,c2,c3) values (?,?,?)
多线程同时操作下,遇到数据库死锁。
1.问题引起原因
在删除时如果使用联合索引,会加next-key lock,但是,对于使用唯一索引锁定行以搜索唯一行的语句,只需要一个索引记录锁。
引用mysql官方文档 :https://dev.mysql.com/doc/refman/8.0/en/innodb-locks-set.html
2.解决问题
修改delete方法
同样还是先删除再插入的逻辑,只是修改下delete的逻辑:
deleteNew(){
// 1. 先查询主键
List<Integer> ids =seleteID(param1,param2);
// 2. 根据主键进行删除
deleteByID(ids)
}