首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

資料庫鎖定排查與解鎖實務:以 Oracle 為例的會話鎖定查詢與 Kill Session

     編輯:關於SqlServer

問題背景

操作不當導致資料表被鎖定,需快速找出阻塞會話並釋放。本文以 Oracle 資料字典視圖為例,原理通用於其他資料庫。

查詢被鎖定會話與鎖定資源

SELECT
    sn.USERNAME,
    m.SID,
    sn.SERIAL#,
    m.TYPE,
    DECODE(m.LMODE,
        0, 'None', 1, 'Null', 2, 'Row Share', 3, 'Row Excl.',
        4, 'Share', 5, 'S/Row Excl.', 6, 'Exclusive',
        LTRIM(TO_CHAR(m.LMODE, '990'))) AS LMODE,
    DECODE(m.REQUEST,
        0, 'None', 1, 'Null', 2, 'Row Share', 3, 'Row Excl.',
        4, 'Share', 5, 'S/Row Excl.', 6, 'Exclusive',
        LTRIM(TO_CHAR(m.REQUEST, '990'))) AS REQUEST,
    m.ID1, m.ID2
FROM V$SESSION sn, V$LOCK m
WHERE (sn.SID = m.SID AND m.REQUEST != 0)  -- 存在鎖請求,被阻塞
   OR (sn.SID = m.SID AND m.REQUEST = 0 AND m.LMODE != 4
       AND (m.ID1, m.ID2) IN (
           SELECT s.ID1, s.ID2 FROM V$LOCK s
           WHERE s.REQUEST != 0 AND s.ID1 = m.ID1 AND s.ID2 = m.ID2
       ))  -- 持有鎖且被其他會話請求
ORDER BY m.ID1, m.ID2, m.REQUEST;

關鍵欄位:SID、SERIAL# 識別會話;LMODE 持有鎖模式;REQUEST 請求鎖模式;ID1, ID2 鎖定資源識別碼。

釋放鎖定:Kill Session

ALTER SYSTEM KILL SESSION 'sid,serial#';

以查得的 SID、SERIAL# 代入,立即終止阻塞會話,資源自動釋放。

補充建議

  • SQL Server 對應查詢:sys.dm_tran_locks、sys.dm_exec_sessions、KILL spid。
  • 殺掉會話會回滾其未提交交易,謹慎確認後執行。
  • 長期解決:優化查詢縮短交易、合理索引降低鎖爭用、調整隔離等級。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved