oracle事务锁导致事务无法提交的问题
程序员文章站
2024-01-13 20:09:52
...
http://blog.csdn.net/Elephant05/article/details/51086077
以系统数据库管理员的身份登录
--无连接启动sqlplus
sqlplus /nolog;
--以sysdba的身份连接数据库
conn /as sysdba;
- 1
- 2
- 3
- 4
- 5
查看被锁的数据对象
--查询被锁的数据对象
select t2.username, t2.sid, t2.serial#, t2.logon_time
from v$locked_object t1, v$session t2
where t1.session_id = t2.sid
order by t2.logon_time;
- 1
- 2
- 3
- 4
- 5
执行上述语句后,得到如下的结果:
表明的确是有用户的数据对象(因为当前数据库实例中只有图中的用户处于活动状态)处于锁定状态,然后需要把该用户的进程kill掉即可。
停止被锁事务数据对象的进程
--同一个sid可能会被不同的session使用,所以通过sid和serial number可以唯一定位;
--下面的sid,和serial#替换成上图中对应的值即可
alter system kill session 'sid,serial#';
- 1
- 2
- 3
使用存储过程来实现:
create or replace procedure killer is
v_obj varchar2(200);
v_sql varchar2(500);
-- v_session varchar2(30);
cursor kill_lockedobj_crs is(
select t2.sid,t2.serial# serial from v$locked_object
t1,v$session t2 where t1.session_id=t2.sid
);
begin
for cont in kill_lockedobj_crs loop
exit when kill_lockedobj_crs%notfound;
v_obj := cont.sid ||','||cont.serial;
v_sql := 'alter system kill session' || v_obj;
execute immediate v_sql;
end loop;
end;
execute killer;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
上一篇: 程序员内功心法-设计模式