oracle行锁的长队列时间

时间:2010-03-11 14:20:14

标签: oracle rowlocking

当我在oracle 9 DB中运行下面的Sql命令时,我一直遇到“enq:TX - row lock contention”。 表mytable是一个小表,少于300行。

UPDATE MYTABLE
SET     col1 = col1 + :B3 ,
        col2    = SYSDATE
WHERE   :B2            = col3
    AND :B1        = col4

我同时运行10个线程,有些等待10秒钟才有机会更新。我知道我将面临这个死锁问题,但问题是他们应该能够更快,因为表很小,所以更新它会很快。

编辑:我无法更改此代码,它位于第三方应用程序中。我只能调整数据库。

我该怎么做才能提高行锁队列的速度?    如何改善这段等待时间,让我的线程运行得更快?

1 个答案:

答案 0 :(得分:2)

如果您不想被阻止,请不要尝试盲目更新。首先执行SELECT FOR UPDATE NOWAIT。如果引发异常(ORA-00054),则表示另一个会话当前正在使用该行。在这种情况下,根据您的要求,您可以尝试更新另一行(您是否尝试构建队列/出列进程?),等待(dbms_lock.sleep)或向调用应用程序返回错误消息。

如果您先使用FOR UPDATE NOWAIT锁定行,永远不会面临死锁。