oracle行锁的长队列时间
当我在Oracle9DB中运行下面的Sql命令时,我一直在运行“enq:TX-row lock configuration”。 表mytable是一个小表,不到300行oracle行锁的长队列时间,oracle,rowlocking,Oracle,Rowlocking,当我在Oracle9DB中运行下面的Sql命令时,我一直在运行“enq:TX-row lock configuration”。 表mytable是一个小表,不到300行 UPDATE MYTABLE SET col1 = col1 + :B3 , col2 = SYSDATE WHERE :B2 = col3 AND :B1 = col4 我同时运行10个线程,有些线程要等待10秒才能有机会更新。我知道我将面临这个死
UPDATE MYTABLE
SET col1 = col1 + :B3 ,
col2 = SYSDATE
WHERE :B2 = col3
AND :B1 = col4
我同时运行10个线程,有些线程要等待10秒才能有机会更新。我知道我将面临这个死锁问题,但对我来说,问题是它们应该能够更快,因为表很小,所以更新它会很快
编辑:我无法更改此代码,它位于第三方应用程序中。我只能调整数据库
如何提高rowlock队列的速度?
如何提高等待时间,使线程运行更快?如果您不想被阻止,请不要尝试盲目更新。首先执行选择更新NOWAIT。如果引发异常(ORA-00054),则表示另一个会话当前正在处理该行。在这种情况下,根据您的要求,您可以尝试更新另一行(是否尝试构建队列/出列进程?),等待(dbms_lock.sleep)或向调用应用程序返回错误消息
如果先用FOR UPDATE NOWAIT锁定行,您将永远不会遇到死锁。您的更新通常会影响多少行?每个更新只影响一行。但很多时候,我有十个线程试图更新同一行。忘记说,但我不能改变代码。现在我编辑了我的question@kurast:更新本身可能不会花费很多时间。等待其他会话提交/回滚的时间。如果这些线程是后台批处理作业,则争用可能是预期的/无害的。如果它们是活动的前台会话,为什么要更新同一行?