死鎖發生後,標準處理是提交/回滾阻塞交易。但實務上往往無法即時聯繫持有鎖的使用者,需 DBA 強制釋放 Session。本文提供分級處理流程:優雅終止 → 強制殺除 → OS 層面清理。
通知應用擁有者在應用層取消操作或提交/回滾交易。若無法聯繫,進入 Level 2。
SELECT s.username,
lo.object_id,
lo.session_id,
s.serial#,
lo.oracle_username,
lo.os_user_name,
lo.process
FROM v$locked_object lo
JOIN v$session s ON lo.session_id = s.sid;
ALTER SYSTEM KILL SESSION 'sid,serial#';
範例:ALTER SYSTEM KILL SESSION '145, 32768';
機制:Session 狀態變為 KILLED,下次發出資料庫呼叫時終止並回滾交易。若 Session 正在執行不可中斷操作(如網路 I/O、Rollback),可能延遲釋放。
SELECT p.spid
FROM v$session s
JOIN v$process p ON s.paddr = p.addr
WHERE s.sid = :deadlocked_sid;
# Linux/Unix
kill -9
# Windows (需管理員權限)
taskkill /PID /F
SELECT * FROM v$locked_object WHERE session_id = :deadlocked_sid;
| 層面 | KILL SESSION | OS KILL PROCESS |
|---|---|---|
| 執行主體 | 資料庫內部 PMON | 作業系統 |
| 回滾保證 | 是(交易完整回滾) | 否(可能留下不一致狀態) |
| 資源清理 | 完整(鎖、暫存段、記憶體) | 不完整(需 PMON 事後清理) |
| 風險 | 低 | 高(極端情況可能導致 Instance Crash) |
| 適用場景 | 常規死鎖處理 | KILL SESSION 無效、資料庫掛起 |
DDL_LOCK_TIMEOUT、啟用 BLOCKING_SESSION 監控告警V$LOCKED_OBJECT),整合至告警平台