資料庫並發控制核心技術。兩大基本鎖模式:
| 鎖類型 | 代碼 | 保護對象 | 備註 |
|---|---|---|---|
| TM 鎖 (表級) | DML Lock | 表結構/資料完整性 | 模式:SS(4), SX(3), S(2), X(6) 等,0-6 表示 |
| TX 鎖 (行級/事務) | Transaction Lock | 具體資料行 | 唯一 X 模式,事務首條 DML 獲得,Commit/Rollback 釋放 |
| SQL 操作 | TM 模式 | 模式碼 |
|---|---|---|
| SELECT ... FOR UPDATE | Row Share (SS) | 4 |
| INSERT/UPDATE/DELETE | Row Exclusive (SX) | 3 |
| LOCK TABLE ... IN SHARE MODE | Share (S) | 2 |
| LOCK TABLE ... IN EXCLUSIVE MODE | Exclusive (X) | 6 |
| DDL (ALTER, DROP) | Exclusive (X) | 6 |
V$LOCK:當前鎖持有/等待狀態 (TYPE='TX', REQUEST>0 表示等待)。V$SESSION:等待事件 enq: TX - row lock contention。V$SESSION_WAIT / V$WAIT_CHAINS (11g+):等待鏈分析。DBA_BLOCKERS / DBA_WAITERS:舊版簡易視圖。SELECT * FROM v$lock WHERE request>0 AND type='TX'; 取得 BLOCK=1 的持有者 SID。SELECT sql_text FROM v$sql WHERE sql_id = (SELECT sql_id FROM v$session WHERE sid = :blocker_sid);ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE; 強制釋放。-- Session 1
UPDATE accounts SET bal=bal-100 WHERE id=1; -- 鎖定行 1
UPDATE accounts SET bal=bal+100 WHERE id=2; -- 等待行 2
-- Session 2
UPDATE accounts SET bal=bal-50 WHERE id=2; -- 鎖定行 2
UPDATE accounts SET bal=bal+50 WHERE id=1; -- 等待行 1 → 死鎖
ORA-00060: deadlock detected while waiting for resource 並產生 *_ora_.trc 追蹤檔。Deadlock graph 列出雙方持有/等待資源、SQL 文本、物件 ID。V$WAIT_CHAINS 可即時查詢等待鏈環路。SELECT ... FOR UPDATE NOWAIT 或 SKIP LOCKED (11g+) 非阻塞鎖定。LOCK_TIMEOUT (12.2+) 設定鎖等待上限。掌握 TM/TX 雙層鎖架構、善用 V$LOCK/V$WAIT_CHAINS 即時診斷、建立應用層統一存取順序規範,是解決 Oracle 鎖爭用與死鎖的系統性方法論。