0

我正在尝试解决在 Oracle AgilePLM 中提示应用程序用户 ORA-00054 的问题。从 sql 日志中,我了解到以下命令导致了此问题。

SELECT 1 FROM CLUSTER_THREAD_LOCKS WHERE LOCK_TYPE = 3 FOR UPDATE OF LOCK_COUNT, LAST_LOCK_TIME NOWAIT

Status:FAILURE

Reason - ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

我无法设置auto commit on,因为它是基于会话的设置,同样适用ddl_lock_timeout,我希望它是全局的。但是,我正在尝试编写一个过程,然后将其安排在 DBMS_JOB 中,它将找到阻塞会话CLUSTER_THREAD_LOCKS并提交该会话。我面临的问题是如何在存储过程中基于 sid 和 serial# 向该会话发出提交。以下是程序:

CREATE OR REPLACE PROCEDURE SP_COMMIT_SESSION()
AS
v_session_no int;
v_sid int;
BEGIN
  
for c in 
  (
  select obj.object_id, ses.sid, ses.serial#,user_objects.object_name, to_char(ses.logon_time, 'MM-DD-YYYY HH24:MI:SS') lock_date
from v$session ses, V$LOCKED_OBJECT obj, user_objects where 
ses.sid = obj.session_id and user_objects.object_id = obj.object_id
AND USER_OBJECTS.OBJECT_NAME = 'CLUSTER_THREAD_LOCKS'
)
loop
  v_session_no := c.serial#;
  v_sid := sid;
  
  /*
  Issue commit here
  */
end loop;

end;

我既不能终止会话,因为我不知道它的影响,也不能更改从应用程序发出 SQL 命令的方式。谁能指出我正确的方向?

4

0 回答 0