ITPub博客

首页 > 数据库 > Oracle > 如何通过sid查询造成死锁的sql语句,并杀死会话

如何通过sid查询造成死锁的sql语句,并杀死会话

Oracle 作者:壹頁書 时间:2013-12-12 23:15:25 0 删除 编辑

1,一个update语句拿不到行锁被阻塞,会话sid=8888,如何找出阻塞者的sql,给出如何杀掉阻塞者会话的语句。

设计一个实验

(一) 会话1 跟新一行数据库,持有锁,目的就是查询出下面造成这天行锁的sql语句

SQL> update emp1 set sal=323 where empno=7369;

1 row updated.

 

(二)会话2 查询本会话的sid

SQL> select sid from v$mystat where rownum=1;

       SID

----------

        36

 

跟新会话1同一行数据,争用行锁

SQL> update emp1 set sal=32232 where empno=7369;

 

新开一个会话,通过dba_waiters 查询那个sid持有行锁

SQL> select WAITING_SESSION,HOLDING_SESSION from dba_waiters;

WAITING_SESSION       HOLDING_SESSION

--------------- -              --------------

             36              35

 

 

 

(三) 通过v$sqlarea 和v$session  两个视图和sid号查询出sql语句

SQL> SELECT SQL_TEXT

  2   FROM V$SQLAREA  A, V$SESSION  B

  3   WHERE A.SQL_ID = B.PREV_SQL_ID

  4   AND B.SID =35;

SQL_TEXT

--------------------------------------------------------------------------------

update emp1 set sal=323 where empno=7369

 

查询sql后通过sid杀掉会话

SQL> select sid,serial# from v$session where sid=35;

       SID    SERIAL#

---------- ----------

        35         67

 

SQL> alter system kill session '35,67';

System altered.

 

会话2的sql执行完毕

SQL> update emp1 set sal=32232 where empno=7369;

1 row updated.

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-1063137/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: JAVA与编码
请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    620
  • 访问量
    6339836