对同一行的并发更新

时间:2017-04-27 22:56:15

标签: mysql

如果我同时从不同的客户端发出以下2个查询,我试图找出MySQL / InnoDB中应该发生的事情:

UPDATE tbl SET a=a+1 WHERE id=123;
UPDATE tbl SET b=b+1 WHERE id=123;

如果查询是在没有显式事务或先前设置的显式早期锁的情况下完成的,documentation解释它的方式,每个查询将尝试获得next-key锁定,因此有效地记录锁定在更新的行上。

我是否理解正确,最糟糕的结果是一个查询等待锁定直到另一个完成?这里的冲突没有异常,对吗?

1 个答案:

答案 0 :(得分:2)

你是对的。这两个更新操作将一个接一个地序列化。他们的订单很难预测,所以你不应该尝试。

如果第三个查询或多或少同时询问SELECT a, b FROM tbl WHERE id=123,则该查询将与其他查询序列化,不可预测。所以它可能发生在其他两个之前,之间或之后。

两个更新查询最终都将完成。这些查询需要的不仅仅是导致死锁。