首页 > mysql在两个索引下两个事务使用同一个语句更新时出现死锁,该怎么解决?

mysql在两个索引下两个事务使用同一个语句更新时出现死锁,该怎么解决?

在表user下有主键id、另一个索引user_id,两个事务使用同一个语句更新时产生死锁。
即:
第一个会话持有锁id, 等待锁user_id。 第二个会话持有锁user_id, 等待锁id。
该怎么处理?
sql更新语句:
update A set gender = '0', updated_at = '2014-11-07 12:26:49' where user_id = 'edd3b39fdbabd12ac20b0bf244c8b152'

错误信息如下:
exception 'PDOException' with message 'SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction


按顺序加锁是非常必要的,像你这样的情况就是经典的死锁场景。

在你这个 UPDATE 语句里面我看不出来哪里需要用到 id 或 user_id 的锁,如果单纯的执行这个语句而没有什么事务的话应该是不会锁的。

如果是事务导致死锁,那你就必须按顺序对 id 或 user_id 加锁,谁在前都可以,但是要保证所有事务顺序统一。加锁一般是用 SELECT FOR UPDATE 来实现。

【热门文章】
【热门文章】