ACID 四大特性
| 特性 | 英文 | 說明 |
| 原子性 | Atomicity | 交易內所有操作要么全做,要么全不做,不可分割 |
| 一致性 | Consistency | 交易完成前後,資料庫從一個一致性狀態轉移到另一個一致性狀態 (滿足所有約束、觸發器、規則) |
| 隔離性 | Isolation | 並發交易間互不干擾,中間狀態對其他交易不可見 |
| 持久性 | Durability | 交易提交後,結果永久保存,即使系統故障也不丟失 |
交易狀態流轉
- 活動狀態:交易啟動,正在執行操作 (初始狀態)。
- 部分提交狀態:最後一條陳述式執行完成,結果可能暫駐記憶體 (尚未刷入磁碟)。
- 提交狀態:資料庫系統將交易所有變更 (含交易日誌記錄) 完全寫入磁碟,寫入 Commit 記錄 → 交易持久化。
- 失敗狀態:執行過程發生錯誤 (邏輯錯誤、系統故障、死鎖犧牲者),無法繼續,進入回滾流程。
- 終止狀態:回滾完成,資料庫恢復至交易開始前狀態,資源釋放。
交易控制語句
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):日誌必須先於資料頁寫入磁碟,保證持久性。
- 檢查點:定期將緩衝區髒頁刷入磁碟,縮短恢復時間。
- 恢復階段 (啟動時):
- 分析階段:掃描日誌找出最後檢查點、未完成交易。
- 重做階段:從檢查點向前,重做所有已提交交易 (Redo)。
- 回滾階段:回滾所有未提交交易 (Undo),釋放鎖定。
最佳實務
- 交易範圍 **越小越好**,減少鎖定持有時間與封鎖風險。
- 避免在交易中進行 **使用者互動、網路呼叫、耗時運算**。
- 設定
SET XACT_ABORT ON:嚴重錯誤自動回滾整個交易。
- 使用
TRY...CATCH (SQL 2005+) 統一錯誤處理與回滾邏輯。
- 長時間交易考慮 **分批提交** 或使用 **樂觀並發 (SNAPSHOT/行版本)** 降低封鎖。