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

SQL Server 交易處理機制與 ACID 特性詳解

     編輯:關於SqlServer

ACID 四大特性

特性英文說明
原子性Atomicity交易內所有操作要么全做,要么全不做,不可分割
一致性Consistency交易完成前後,資料庫從一個一致性狀態轉移到另一個一致性狀態 (滿足所有約束、觸發器、規則)
隔離性Isolation並發交易間互不干擾,中間狀態對其他交易不可見
持久性Durability交易提交後,結果永久保存,即使系統故障也不丟失

交易狀態流轉

  1. 活動狀態:交易啟動,正在執行操作 (初始狀態)。
  2. 部分提交狀態:最後一條陳述式執行完成,結果可能暫駐記憶體 (尚未刷入磁碟)。
  3. 提交狀態:資料庫系統將交易所有變更 (含交易日誌記錄) 完全寫入磁碟,寫入 Commit 記錄 → 交易持久化。
  4. 失敗狀態:執行過程發生錯誤 (邏輯錯誤、系統故障、死鎖犧牲者),無法繼續,進入回滾流程。
  5. 終止狀態:回滾完成,資料庫恢復至交易開始前狀態,資源釋放。

交易控制語句

BEGIN TRANSACTION;   -- 開始交易
COMMIT TRANSACTION;  -- 提交交易 (持久化)
ROLLBACK TRANSACTION;-- 回滾交易 (撤銷)
SAVE TRANSACTION SavePoint; -- 設定儲存點 (部分回滾)
@@TRANCOUNT          -- 目前巢狀交易層級

隔離等級與並發異常

隔離等級髒讀不可重複讀幻讀並發度
READ UNCOMMITTED✅ 可能✅ 可能✅ 可能最高
READ COMMITTED (預設)❌✅ 可能✅ 可能高
REPEATABLE READ❌❌✅ 可能中
SERIALIZABLE❌❌❌最低
SNAPSHOT (行版本)❌❌❌高 (寫寫衝突除外)
  • 髒讀:讀到未提交的資料。
  • 不可重複讀:同一交易內兩次讀取同一列,結果不同 (被其他交易修改/刪除)。
  • 幻讀:同一交易內兩次執行相同範圍查詢,筆數不同 (被其他交易插入/刪除)。

交易日誌與恢復機制

  • .ldf 檔案:循序寫入,記錄邏輯操作 (INSERT/UPDATE/DELETE/BEGIN/COMMIT) 與資料前後映像 (Physiological Logging)。
  • WAL (Write-Ahead Logging):日誌必須先於資料頁寫入磁碟,保證持久性。
  • 檢查點:定期將緩衝區髒頁刷入磁碟,縮短恢復時間。
  • 恢復階段 (啟動時):
    1. 分析階段:掃描日誌找出最後檢查點、未完成交易。
    2. 重做階段:從檢查點向前,重做所有已提交交易 (Redo)。
    3. 回滾階段:回滾所有未提交交易 (Undo),釋放鎖定。

最佳實務

  1. 交易範圍 **越小越好**,減少鎖定持有時間與封鎖風險。
  2. 避免在交易中進行 **使用者互動、網路呼叫、耗時運算**。
  3. 設定 SET XACT_ABORT ON:嚴重錯誤自動回滾整個交易。
  4. 使用 TRY...CATCH (SQL 2005+) 統一錯誤處理與回滾邏輯。
  5. 長時間交易考慮 **分批提交** 或使用 **樂觀並發 (SNAPSHOT/行版本)** 降低封鎖。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved