Mysql 更新后如何防止SELECT FOR UPDATE中出现死锁异常?

Mysql 更新后如何防止SELECT FOR UPDATE中出现死锁异常?,mysql,sql,mariadb,innodb,pessimistic-locking,Mysql,Sql,Mariadb,Innodb,Pessimistic Locking,我有一个账户表,有一行。 我有两个线程执行下一步: 第一个线程: begin transaction; select * from account where balance=0 for update; UPDATE account SET balance = 10 WHERE balance=0; // waiting here for several seconds commit transaction; 第二个线程: begin transaction; select * from ac

我有一个
账户
表,有一行。 我有两个线程执行下一步:

第一个线程:

begin transaction;
select * from account where balance=0 for update;
UPDATE account SET balance = 10 WHERE balance=0;
// waiting here for several seconds
commit transaction;
第二个线程:

begin transaction;
select * from account where balance=0 for update;
commit transaction;
流程是下一个:
1) 第一个线程启动并继续运行到
等待几秒钟的
行。
2) 第二个线程启动并被阻塞(逻辑上是因为第一个线程尚未释放悲观锁)。
3) 第一个线程成功提交事务。
4) 第二个线程收到错误:
error 1213(40001):尝试获取锁时发现死锁;尝试重新启动事务


若并没有死锁,为什么在这种情况下会出现死锁异常?我用所有4个事务隔离级别尝试了这个场景,所有隔离级别都会出现相同的错误。

问题是我的错误。所以上面的代码实际上应该可以工作。 我的问题是,我在第一个线程中使用了共享模式下的
锁定
,在第二个线程中使用了
更新
。我以为他们是一样的,但实际上他们不是。当我将第一个线程更改为使用
进行更新时
,它们开始正常工作


感谢您提供了使用innodb状态监视器检查死锁事务信息的提示(
显示引擎innodb状态;
)。

使用innodb状态监视器找出死锁的确切原因。@Shadow谢谢。我将尝试监控它,然后更新问题。