2

当我在 oracle 9 DB 中运行下面的 Sql 命令时,我一直遇到“enq:TX - 行锁争用”。表 mytable 是一个小表,不到 300 行。

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

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

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

我可以做些什么来提高行锁队列的速度?我怎样才能改善这个等待时间,让我的线程运行得更快?

4

1 回答 1

2

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

如果您首先使用 FOR UPDATE NOWAIT 锁定该行,您将永远不会遇到死锁。

于 2010-03-11T14:49:45.163 回答