如何通過sid查詢造成死鎖的sql語句,並殺死會話

kingsql發表於2015-02-26

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.

 

會話2sql執行完畢

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

1 row updated.

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28389881/viewspace-1441971/,如需轉載,請註明出處,否則將追究法律責任。

相關文章