最近,我们遇到了一个死锁问题。我们系统的两个部分将在相似的时间更新同一个表,一个更新(命名为“UP1”)事务中的几行,另一个(命名为“UP2”)使用类似“update ... where id”的 sql在 (...)”。
似乎是因为 sql "update ... where id in (...)" 中的 id 乱序,例如 "5,6,2,3,4,1"; 并且在事务中,更新操作将按照“1,2,3,4,5,6”的顺序执行。当“UP1”更新id“1,2,3,4”,“UP2”更新id“5,6”时,“UP1”想要被“UP2”锁定的id 5,“UP2”想要被“UP1”锁定的id 2,所以死锁就出来了。
我的问题是,数据库是否会一一锁定行,只有在 sql 或事务完成时才释放它们?如果不是,为什么不能在事务开始时锁定所有行或“where id in (...)” sql,为什么不能一一释放更新的行?
期待任何有用的回复,谢谢。