代码之家  ›  专栏  ›  技术社区  ›  kurast

Oracle行锁的长队列时间

  •  2
  • kurast  · 技术社区  · 16 年前

    在oracle 9 db中运行下面的sql命令时,我一直遇到“enq:tx-row锁争用”。 MyTable表是一个小表,少于300行。

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

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

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

    如何提高rowlock队列的速度? 如何提高等待时间,使线程运行得更快?

    1 回复  |  直到 16 年前
        1
  •  2
  •   Vincent Malgrat    16 年前

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

    你会 从未 如果先用for update nowait锁定行,则将面临死锁。

    推荐文章