我正在尝试解决在 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 命令的方式。谁能指出我正确的方向?