我们在生产中遇到了一些问题,其中一些开发人员未提交导致锁定的事务。如果交易在一定时间内未完成并没有提交,我有办法回滚吗?
答案 0 :(得分:4)
您可以创建新数据库或更改当前数据库配置文件,以限制用户的空闲时间:
Create Profile Idle_Time_Out limit idle_time 30;
,然后将用户分配给该个人资料:
Alter User some_user Profile Idle_Time_Out;
上面的配置文件会将some_user限制为不活动30分钟,此时他们的会话将被断开,所有未提交的事务将被回滚。
答案 1 :(得分:0)
您可以创建PROCEDURE kill_long_transaction
并手动运行一个过程,或者按计划运行该过程。
如果您限制配置文件中的非活动时间,则所有非活动会话将被标记为已终止。当开发人员编写代码或会话很少被应用程序使用时,这可能会带来不便。
CREATE OR REPLACE PROCEDURE kill_long_transaction (time_transaction in number default 30 )
IS
BEGIN
FOR loop_kill IN (
select
s.sid,s.serial#
from
v$session s,
v$transaction t
where
s.taddr = t.addr
and round((sysdate -t.start_date)*60*24 ,2) >time_transaction
)
LOOP
execute immediate 'alter system kill session '''||loop_kill.sid||','||loop_kill.serial#||''' ';
END LOOP loop_kill;
END;