首页 > 数据库 > Oracle > 如何通过sid查询造成死锁的sql语句,并杀死会话
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/ ,如需转载,请注明出处,否则将追究法律责任。