在分析由两个并发SELECT FOR UPDATE
语句引起的死锁时,我发现以下有趣的文章:https://hoopercharles.wordpress.com/2011/11/21/select-for-update-in-what-order-are-the-rows-locked/
本文证明了Oracle通过在访问行的顺序中执行行(TX)锁定,而不是按照获取行的顺序(即,未按ORDER BY
指定的顺序)执行行(TX)锁定,从而表现出与MySQL和PostgreSQL不同的行为。
在我的场景中,查询A在where子句中指定了表的PK,而查询B仅索引了FK。两者都访问超过500行。我知道,如果通过索引FK进行访问,与通过PK进行访问相比,我们很容易获得另一种TX锁定顺序,因此可能导致死锁。
如果两个查询仅使用PK,TX锁定的顺序是否确定?即我是否可以确定两个SELECT FOR UPDATE
条件较大的PK IN
查询没有死锁? PK列已编制索引,从未更改,并且单调递增。
我知道在这种情况下通常会使用NOWAIT
子句,但是仍然对是否可以不使用该问题就可以解决仍然很感兴趣。谢谢。