Oracle 如何更新表,即使它被用户锁定
我有一个集成包,它执行ap_payment_schedules_all表的更新。 但是,如果任何用户与此表或ap_all保持非活动会话, 并发进程在队列中等待执行。 我需要使这个并发以避免这些锁。 我应该在我的选择中添加什么 提前谢谢 下面的事情没有解决:Oracle 如何更新表,即使它被用户锁定,oracle,plsql,transactions,locking,Oracle,Plsql,Transactions,Locking,我有一个集成包,它执行ap_payment_schedules_all表的更新。 但是,如果任何用户与此表或ap_all保持非活动会话, 并发进程在队列中等待执行。 我需要使这个并发以避免这些锁。 我应该在我的选择中添加什么 提前谢谢 下面的事情没有解决: for update nowait for update skip locked for blah ( select ... from table union all select ... from table); update tab
for update nowait
for update skip locked
for blah (
select ... from table
union all
select ... from table);
update table
set a1 = blah.a
where ....;
一旦获得了锁,就无法更新该锁在Oracle中,除了通过ALTER SYSTEM kill session“…”终止该用户的会话之外,没有其他方法可以打破另一个用户的锁 这就给您留下了几个选择: 1在程序运行时监视数据库,确保程序没有等待锁定。您可以从V$SESSION.blocking_SESSION和V$SESSION.FINAL_blocking_SESSION中获取有关哪些会话正在阻止哪些其他会话的信息 如果合适的话,您可以去找DBA终止阻塞会话。显然,你需要确定你要杀的是谁/什么。如果只是一个用户把应用程序打开回家过夜,那么它可能是安全的 2.使用选择。。对于更新,请等待3次,或者在获取要处理的行时等待多长时间。这有时在循环结构中完成,如下所示:
FOR r IN ( SELECT rowid row_id, <other columns> FROM ... WHERE ... ) LOOP
-- These are the rows we need to process. Acquire a lock on each one before attempting.
BEGIN
SELECT 'x' FROM ... WHERE rowid = r.row_id FOR UPDATE WAIT 3;
-- If you get here, you have a lock.
... processing ...
EXCEPTION
-- You'll need to define e_wait_timeout and associate ORA-30006 to it via pragma exception_init...
WHEN e_wait_timeout THEN
-- Record that the record was skipped so you can process it later.
END;
END LOOP;
如果用户持有锁,他们就会持有锁。你不能在锁周围工作。您所能做的就是与DBA讨论如何处理长时间运行的非活动会话,并可能杀死它们。或者,您可以获得对数据库的受限访问窗口。