事務是數據庫操作的邏輯單元,具備原子性、一致性、隔離性、持久性(ACID)。本文系統講解四大特性、三大讀異常、四種隔離級別對比表、事務組成語句、提交方式、以及 Spring 風格的七種事務傳播行為,構建完整事務知識體系。
| 異常 | 現象 | 本質 |
|---|---|---|
| 髒讀 | 讀到未提交數據 | 事務 A 修改未提交,事務 B 讀取並依賴 |
| 不可重複讀 | 同一事務兩次讀同記錄,數據不同 | 事務 A 讀取間隙,事務 B 修改並提交 |
| 幻讀 | 同一查詢條件重新讀取,發現新增滿足條件記錄 | 事務 A 讀取間隙,事務 B 插入新記錄並提交 |
| 級別 | 髒讀 | 不可重複讀 | 幻讀 | 鎖/並發特點 |
|---|---|---|---|---|
| Read Uncommitted | ✗ 可能 | ✗ 可能 | ✗ 可能 | SELECT 無鎖,並發最高,數據最不安全 |
| Read Committed | ✓ 解決 | ✗ 可能 | ✗ 可能 | 只讀已提交,Oracle 默認 |
| Repeatable Read | ✓ 解決 | ✓ 解決 | ✗ 可能(InnoDB 靠 Next-Key Lock 緩解) | InnoDB 默認,事務內查詢一致性快照 |
| Serializable | ✓ 解決 | ✓ 解決 | ✓ 解決 | 全表共享鎖,讀寫互斥,並發最低 |

COMMIT。autocommit=ON 時每條語句提交。| 傳播類型 | 行為描述 | 回滾影響範圍 |
|---|---|---|
| REQUIRED | 有事務則加入,無則新建 | 任意處異常全量回滾 |
| SUPPORTS | 有事務則加入,無則非事務運行 | 無事務時不回滾 |
| MANDATORY | 必須在事務中運行,否則拋異常 | 父事務回滾則連帶回滾 |
| REQUIRES_NEW | 掛起當前事務,新建獨立事務 | 內層提交後外層回滾不影響內層 |
| NOT_SUPPORTED | 掛起當前事務,非事務運行 | 不參與事務回滾 |
| NEVER | 不能在事務中運行,否則拋異常 | 不適用 |
| NESTED | 嵌套事務,基於 Savepoint | 父回滾則子回滾,子回滾可不影響父 |
理解傳播行為關鍵在於「事務邊界」與「回滾範圍」,REQUIRED 最常用,REQUIRES_NEW 適合獨立日志記錄,NESTED 利用 Savepoint 實現部分回滾。