欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

执行上述语句后,得到如下的结果:

oracle事务锁导致事务无法提交的问题

表明的确是有用户的数据对象(因为当前数据库实例中只有图中的用户处于活动状态)处于锁定状态,然后需要把该用户的进程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

上一篇: 程序员内功心法-设计模式

下一篇: