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

Oracle DML 鎖機制詳解:行鎖與表鎖模式完整指南

     編輯:Oracle 教學

Oracle DML 鎖機制詳解:行鎖與表鎖模式完整指南

DML 鎖(Data Lock)保障多用戶並發操作時的資料完整性,防止衝突的 DML 與 DDL 同時發生。主要分為行鎖(Row Locks,TX)與表鎖(Table Locks,TM),不同 DML 操作會自動請求對應鎖。

行鎖(Row Locks,TX)

當事務執行 INSERT、UPDATE、DELETE、MERGE 或 SELECT ... FOR UPDATE 時,對目標行加排他鎖(Exclusive Lock),直到 COMMIT 或 ROLLBACK 釋放。行鎖防止兩個事務同時修改同一行,提供最高並發度。

獲得行鎖的同時,事務也會在所屬表上加子排他鎖(Subexclusive, SX),阻止衝突的 DDL 操作(如 DROP TABLE、ALTER TABLE)。

行鎖與並發實戰演示

建立測試表並初始化:

CREATE TABLE employees(employee_id NUMBER(10), salary NUMBER(10));
INSERT INTO employees VALUES(100, 512);
INSERT INTO employees VALUES(101, 600);

步驟 1:三個 Session 同時查詢

皆返回原始資料(100→512, 101→600),查詢不加鎖,互不干擾。

步驟 2:Session 1 更新 employee_id=100

UPDATE employees SET salary = 612 WHERE employee_id = 100;

Session 1 獲得該行排他鎖。其他 Session 嘗試更新同一行將阻塞。

步驟 3:三個 Session 再次查詢

  • Session 1 見到 612(未提交的修改)
  • Session 2、3 仍見 512(讀取一致性,見到提交前的版本)

步驟 4:Session 2 更新 employee_id=101 且不提交

Session 2 獲得 101 行鎖。

步驟 5:再次查詢

  • Session 1:100→612, 101→600
  • Session 2:100→512, 101→700(見到自己的未提交修改)
  • Session 3:100→512, 101→600

展示 Oracle 讀取一貫性:各 Session 見到的資料版本取決於自身事務狀態。

行鎖儲存機制

鎖資訊儲存在 Data Block 中。資料庫使用佇列機制處理鎖請求:

  • 事務請求未鎖定行 → 在 Block Header 寫入事務 ID 拷貝
  • 被修改的每一行指向該事務 ID
  • 事務結束後,事務 ID 保留在 Block Header
  • 後續事務欲修改同行 → 檢查事務 ID 是否仍活躍
  • 活躍則等待通知;非活躍則獲得鎖

表鎖(Table Locks,TM)模式完整表

執行 INSERT/UPDATE/DELETE/MERGE/SELECT FOR UPDATE/LOCK TABLE 時自動請求。阻止衝突的 DDL。

模式縮寫別名特性相容性
Row ShareRSSubshare (SS)鎖定表上特定行,意圖更新。限制最小,支援高並發行修改與 RS、RX、S、SRX 相容;與 X 衝突
Row ExclusiveRXSubexclusive (SX)更新表行或 SELECT FOR UPDATE。允許其他事務查詢、插入、更新、刪除、鎖定多行與 RS、RX 相容;與 S、SRX、X 衝突
ShareS—允許查詢(除 FOR UPDATE),僅持有者可更新。多事務可同時持有 S,但不保證能修改與 RS、S 相容;與 RX、SRX、X 衝突
Share Row ExclusiveSRXShare-Subexclusive (SSX)比 S 更強。同一時間僅一事務可持有。允許查詢,禁止更新僅與 RS 相容;與 RX、S、SRX、X 衝突
ExclusiveX—限制最強。禁止任何 DML 與任何鎖請求與所有模式衝突

鎖模式相容性矩陣速查

請求模式 →  | RS | RX | S  | SRX | X
持有模式 ↓  |    |    |    |     |
RS           | Y  | Y  | Y  |  Y  | N
RX           | Y  | Y  | N  |  N  | N
S            | Y  | N  | Y  |  N  | N
SRX          | Y  | N  | N  |  N  | N
X            | N  | N  | N  |  N  | N

Y=相容,N=衝突。實務上最常見為 RX(DML 隱式鎖)與 RS(SELECT FOR UPDATE 觸發)。

實務建議

  • 盡量縮短事務長度,減少鎖持有時間
  • 避免長時間運行的未提交事務造成阻塞鏈
  • 必要時使用 SELECT ... FOR UPDATE NOWAIT 或 SKIP LOCKED 避免無限等待
  • 監控 V$SESSION、V$LOCK 排查鎖爭用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved