我一直运行到“ENQ:TX - 行锁争用”,当我在一个预言9 DB运行下面的SQL命令。 表MYTABLE是一个小的表,具有小于300线。

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

我运行在同一时间10个线程,而一些等待,只要10秒,得到一个机会来更新。我知道我会面对这个僵局的问题,但对我的问题是,他们应该能够快很多,由于表很小,因此更新将是快。

修改:我不能改变该代码,它是一个第三方应用程序内。我只能调整DB中。

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

有帮助吗?

解决方案

如果您不希望被阻止不要尝试更新盲目。 FOR UPDATE NOWAIT执行SELECT第一。如果你抛出一个异常(ORA-00054),这意味着另一个会话目前正与该行合作。在这种情况下,根据您的要求,您可以尝试更新另一行(你想建立一个队列/出队的过程?),等待(DBMS_LOCK.SLEEP)或返回错误信息到调用应用程序。

您的从不面对僵局,如果你用FOR UPDATE NOWAIT第一锁定该行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top