题
我一直运行到“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第一锁定该行。
不隶属于 StackOverflow