当我在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秒钟才有机会更新。我知道我将面临这个死锁问题,但问题是他们应该能够更快,因为表很小,所以更新它会很快。
编辑:我无法更改此代码,它位于第三方应用程序中。我只能调整数据库。
我该怎么做才能提高行锁队列的速度? 如何改善这段等待时间,让我的线程运行得更快?
答案 0 :(得分:2)
如果您不想被阻止,请不要尝试盲目更新。首先执行SELECT FOR UPDATE NOWAIT。如果引发异常(ORA-00054),则表示另一个会话当前正在使用该行。在这种情况下,根据您的要求,您可以尝试更新另一行(您是否尝试构建队列/出列进程?),等待(dbms_lock.sleep)或向调用应用程序返回错误消息。
如果您先使用FOR UPDATE NOWAIT锁定行,永远不会面临死锁。