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

Oracle 數據庫事務深度解析:ACID 特性、隔離級別與鎖機制

     編輯:Oracle 教學

事務基礎概念

事務是並發控制的基本單位,由一組 SQL 語句組成的邏輯工作單元,具備 ACID 四大特性:

特性英文說明
原子性Atomicity全做或全不做,不可分割
一致性Consistency事務前後數據完整性約束保持一致
隔離性Isolation並發事務互不干擾
持久性Durability提交後變更永久保存

事務控制語句

-- 顯式事務控制
SET TRANSACTION READ WRITE;  -- 或 READ ONLY
SAVEPOINT sp_before_update;  -- 設置保存點
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- 發現錯誤回滾到保存點
ROLLBACK TO sp_before_update;
-- 確認無誤提交
COMMIT;

SQL 標準隔離級別與現象

隔離級別對比圖
隔離級別髒讀不可重複讀幻讀鎖策略
READ UNCOMMITTED✅ 可能✅ 可能✅ 可能無共享鎖
READ COMMITTED❌ 防止✅ 可能✅ 可能讀取即釋放共享鎖
REPEATABLE READ❌ 防止❌ 防止✅ 可能持有共享鎖至事務結束
SERIALIZABLE❌ 防止❌ 防止❌ 防止範圍鎖/表鎖

三大並發異常現象

  • 髒讀:事務 A 讀取事務 B 未提交的修改,B 回滾導致 A 數據無效
  • 不可重複讀:事務 A 多次讀取同一行,事務 B 提交修改導致結果不一致
  • 幻讀:事務 A 多次範圍查詢,事務 B 提交插入導致結果集行數變化

Oracle 實際支援的隔離級別

級別標準對應特點適用場景
READ COMMITTEDSQL92 標準默認級別,語句級讀一致性,防髒讀高併發 OLTP 系統
SERIALIZABLESQL92 標準事務級讀一致性,防三大異常,可能報 ORA-08177報表、批量處理、需嚴格一致性
READ ONLY非標準僅查詢,事務級一致性,無 DML 操作長時間報表查詢

關鍵差異:語句級 vs 事務級讀一致性

  • READ COMMITTED:每條 SQL 執行時刻看到已提交數據,同一事務中兩次查詢結果可能不同
  • SERIALIZABLE:事務開始時刻(SCN)凍結數據快照,全事務看到一致視圖

設置隔離級別

-- 當前事務級別
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET TRANSACTION READ ONLY;

-- 會話級別(影響後續所有事務)
ALTER SESSION SET ISOLATION_LEVEL = READ COMMITTED;
ALTER SESSION SET ISOLATION_LEVEL = SERIALIZABLE;

Oracle 鎖機制與事務交互

鎖類型

  • DML 鎖(行鎖 TX):INSERT/UPDATE/DELETE 自動獲取,排他鎖,阻塞其他寫操作
  • DDL 鎖:結構變更獲取,排他表鎖
  • 系統鎖:Latch、Mutex 保護內存結構

事務與鎖的關係

  • 事務開始隱式獲取 TX 鎖(SET TRANSACTION 或首條 DML)
  • 行鎖持有至 COMMIT/ROLLBACK,不隨語句結束釋放
  • SELECT ... FOR UPDATE 手動加排他鎖
  • Oracle 讀不阻塞寫、寫不阻塞讀(多版本並發控制 MVCC)

死鎖檢測與處理

  • Oracle 自動檢測死鎖,犧牲一方回滾(報 ORA-00060)
  • 應用層預防:統一訪問表順序、縮短事務、避免長事務
  • 監視視圖:V$LOCK、V$SESSION_WAIT、DBA_BLOCKERS
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved