Oracle 如何更新表,即使它被用户锁定

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

我有一个集成包,它执行ap_payment_schedules_all表的更新。 但是,如果任何用户与此表或ap_all保持非活动会话, 并发进程在队列中等待执行。 我需要使这个并发以避免这些锁。 我应该在我的选择中添加什么

提前谢谢

下面的事情没有解决:

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讨论如何处理长时间运行的非活动会话,并可能杀死它们。或者,您可以获得对数据库的受限访问窗口。