问题描述
如何在Oracle中设置锁定等待超时我们正在从java应用程序中执行插入/更新/删除。有时由于长时间运行的事务或某个事务在特定行上获得的缓慢锁定被另一个事务击中,并且会发生阻塞会话。在这种情况下,我们希望应用锁定等待超时,以便等待会话不会长时间等待锁定,并在一段时间后超时。有什么办法可以做吗?请指教。我听说过distributed_lock_timeout。如何在这里应用。
专家解答
参数distributed_lock_timeout与数据库链接上的语句有关。所以这可能不是你想要的。
对于阻止DDL语句,您可以使用ddl_lock_timeout控制超时。这给出了以秒为单位等待DDL的时间。
您可以在会话1中看到这一点:
然后在会话2中运行:
并非非阻塞DDL (例如alter table ... add column) 仍会等待会话1提交/回滚。
当涉及到DML时,您可以运行select...对于更新,请在更新/删除之前等待N。如果它在N秒内无法获得锁定,这将得到解决。
返回会话1运行:
然后在第2节中:
对于阻止DDL语句,您可以使用ddl_lock_timeout控制超时。这给出了以秒为单位等待DDL的时间。
您可以在会话1中看到这一点:
create table t ( c1 int, c2 int ); insert into t values (1, 1);复制
然后在会话2中运行:
alter session set ddl_lock_timeout = 10; alter table t drop ( c2 ); ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired复制
并非非阻塞DDL (例如alter table ... add column) 仍会等待会话1提交/回滚。
当涉及到DML时,您可以运行select...对于更新,请在更新/删除之前等待N。如果它在N秒内无法获得锁定,这将得到解决。
返回会话1运行:
commit; update t set c1 = 0, c2 = 0;复制
然后在第2节中:
declare cur sys_refcursor; begin open cur for select * from t for update wait 10; delete t; end; / ORA-30006: resource busy; acquire with WAIT timeout expired ORA-06512: at line 4 select * from t; C1 C2 1 1复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。