可以在ORA中强制执行TX锁定的顺序吗?

时间:2018-12-21 12:31:21

标签: oracle oracle11g deadlock

在分析由两个并发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子句,但是仍然对是否可以不使用该问题就可以解决仍然很感兴趣。谢谢。

0 个答案:

没有答案