这种mysql update方式引起的Deadlock你有没有遇到过!!!

240 阅读1分钟

当我们想要更新一批数据时,是否有过这种操作:

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)
	}