交易是資料庫區別於檔案系統的關鍵特性,將多個操作綁定為不可分割的邏輯單元。本文系統梳理 ACID 四大特性、隱性提交模式與實戰控制語法。
| 特性 | 英文 | 核心含義 |
|---|---|---|
| 原子性 | Atomicity | 交易內所有操作要麼全成功,要麼全失敗回滾 |
| 一致性 | Consistency | 交易前後資料庫從一個一致狀態轉移到另一個一致狀態 |
| 隔離性 | Isolation | 並發交易互不干擾,四大隔離級別控制可見度 |
| 持久性 | Durability | 交易提交後,修改永久保存,不會因系統崩潰丟失 |
MySQL 預設 autocommit = ON,每條 SQL 隱性包裹為單獨交易自動提交。需顯式開啟交易塊:
-- 關閉自動提交 SET autocommit = 0; -- 或顯式開啟交易 START TRANSACTION; -- 標準語法 BEGIN; -- MySQL 別名 -- 業務操作 INSERT INTO orders ...; UPDATE inventory SET stock = stock - 1 WHERE id = 100; -- 提交或回滾 COMMIT; -- 永久生效 ROLLBACK; -- 完全撤銷
| 隔離級別 | 髒讀 | 不可重複讀 | 幻讀 | 鎖開銷 |
|---|---|---|---|---|
| READ UNCOMMITTED | 可能 | 可能 | 可能 | 最低 |
| READ COMMITTED | 不可能 | 可能 | 可能 | 低 |
| REPEATABLE READ | 不可能 | 不可能 | 可能 | 中 |
| SERIALIZABLE | 不可能 | 不可能 | 不可能 | 最高 |
MySQL InnoDB 預設 REPEATABLE READ,透過 MVCC(多版本併發控制)實現無鎖一致性讀,大幅提升並發效能。
-- 當前會話 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 全域預設 SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION; INSERT INTO account_log ...; SAVEPOINT before_transfer; UPDATE accounts SET balance = balance - 100 WHERE id = 1; -- 發現錯誤,回滾至儲存點 ROLLBACK TO SAVEPOINT before_transfer; COMMIT;