场景:
mysql当使用InnoDB,update语句的where条件没有使用主键索引(聚簇索引),而是使用非主键索引时,会先锁住当前非主键索引,然后再尝试获取主键索引; 如果事务一: 已经获取id =1 这一行的主键索引和 id = 2这一行的非主键索引; 事务二: 已经获取id =2 这一行的主键索引, id = 1这一行的非主键索引。两个事务出现相互等待的循环,也就是死锁。
解决方式:
update的时候,先select出所有需要更新的记录,然后再update,where只采用主键做条件。所有update语句将会只锁住主键索引,而不会尝试锁非主键索引。