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

Oracle 並發控制核心機制:鎖類型、隔離級別與實戰觀察

     編輯:Oracle 資料庫基礎

並發控制要解決的三大問題

現象說明範例結果
髒讀讀到未提交的資料,回滾後資料不一致T1 加 100 未提交,T2 讀到 120 並減 10,T1 回滾 → 結果 110 (錯)
不可重複讀同一交易多次讀取同一資料,結果不同T1 讀 20,T2 讀 20,T1 改 120,T2 改 10,T1 寫入 110,T2 覆蓋寫入 10 (錯)
幻讀範圍查詢前後筆數不同 (新增/刪除)T1 掃描全表,T2 插入新列,T1 發現「多出」列

SQL-92 四大隔離級別 vs Oracle 實作

隔離級別髒讀不可重複讀幻讀Oracle 支援
Read Uncommitted允許允許允許不支援
Read Committed防止允許允許預設
Serializable防止防止防止支援 (效能較低)
Read Only防止防止防止Oracle 專有 (禁止 UPDATE)

設定隔離級別

-- 交易層級 (交易開始前)
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET TRANSACTION ISOLATION LEVEL READ ONLY;

-- Session 層級
ALTER SESSION SET ISOLATION_LEVEL = READ COMMITTED;
ALTER SESSION SET ISOLATION_LEVEL = SERIALIZABLE;
ALTER SESSION SET ISOLATION_LEVEL = READ ONLY;

Oracle 自動鎖機制

依 SQL 類型

  • DDL 鎖:CREATE/ALTER/DROP/TRUNCATE → 獨佔資料庫物件結構。
  • DML 鎖:INSERT/UPDATE/DELETE → 列級獨佔鎖 (TX) + 表級共享鎖 (TM)。
  • 內部鎖:資料檔/控制檔/Redo Log 等內部結構管理。

依粒度

  • 資料庫級:ALTER SYSTEM ENABLE RESTRICTED SESSION (限制模式)、STARTUP MOUNT; ALTER DATABASE OPEN READ ONLY。
  • 表級:DML 自動加 TM 鎖,模式依 DML 類型 (RS/RX/S/SRX/X)。
  • 列級:DML 修改列時加 TX 獨佔鎖,防止同列並發更新。
  • Oracle 不支援欄級鎖。

鎖模式相容性速查 (TM 鎖)

模式相容性典型場景
Share (S)允許其他 S,禁止 X建立索引
Row Share (RS)允許其他 RS/RX/S/SRX,禁止 XSELECT ... FOR UPDATE
Row Exclusive (RX)允許其他 RS/RX,禁止 S/SRX/XINSERT/UPDATE/DELETE (預設)
Share Row Exclusive (SRX)僅允許 RS,禁止其他較少見
Exclusive (X)完全獨佔DROP TABLE / ALTER TABLE

TX 鎖永遠為 Exclusive (X),列級獨佔。

實戰觀察:Enterprise Manager 鎖監控

執行 UPDATE dept SET loc='北京' WHERE deptno=40; 後,EM 顯示:

  • 用戶 SCOTT, SID=10
  • TM 鎖 (表級) 模式 Row Exclusive (RX)
  • TX 鎖 (列級) 模式 Exclusive (X)

驗證:DML 同時持有表級 RX (允許並發 DML) 與列級 X (序列化同列更新)。

總結

  • 預設 Read Committed 滿足多數業務,平衡一致性與並發度。
  • 需嚴格一致性 (報表、轉帳) 時改用 Serializable,接受「ORA-08177: can't serialize」重試邏輯。
  • 鎖由 Oracle 自動管理,開發者專注於 SELECT ... FOR UPDATE、LOCK TABLE 等顯式鎖輔助業務邏輯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved