如果同时从不同的客户端发出以下两个查询,我将试图找出MySQL/InnoDB中应该发生的事情:
UPDATE tbl SET a=a+1 WHERE id=123;
UPDATE tbl SET b=b+1 WHERE id=123;如果查询是在没有更早设置的显式事务或显式早期锁的情况下完成的,按照文档解释的方式,每个查询都将尝试获取一个next-key锁,因此实际上是更新行上的一个记录锁。
我是否理解得对,最糟糕的结果是一个查询等待锁,直到另一个查询完成?这里的冲突不可能有例外,对吧?
发布于 2017-04-27 23:36:50
你是对的。这两个更新操作将一个接一个地序列化。他们的顺序很难预测,所以你不应该尝试。
如果第三个查询或多或少地同时询问SELECT a, b FROM tbl WHERE id=123,则该查询将与其他查询一起序列化,这是不可预测的。因此,它可能发生在之前,之间,或在其他两个之后。
这两个更新查询最终都将完成。造成死锁所需的不仅仅是这些查询。
https://stackoverflow.com/questions/43669189
复制相似问题