事務機制本質是異常恢復保障,但鎖資源、寫日誌、協調協議都消耗效能。優秀的事務設計不是「用盡事務」,而是「在正確的範圍、正確的粒度、正確的隔離級別」使用事務。
事務持有鎖的時間直接決定併發吞吐量。長事務會讓其他事務排隊等待,系統吞吐量斷崖式下跌。
用戶思考時間以「秒」計算,資料庫鎖持有數秒已屬極長。若用戶離座吃飯、下班,系統癱瘓。事務期間嚴禁 I/O 等待。
轉帳案例:查餘額、扣款、入帳、寫流水 5 步 SQL 若拆成 5 個事務,中間任一步失敗會導致資料不一致(錢憑空消失/產生)。業務不變量定義事務邊界。
綜合鐵律 1、3:事務範圍 = 業務一致性要求的最小閉包。既要避免長事務拖垮效能,又要防止過度拆分破壞一致性。
隔離級別與效能呈負相關:
| 級別 | 髒讀 | 不可重複讀 | 幻讀 | 效能 |
|---|---|---|---|---|
| Read Uncommitted | 是 | 是 | 是 | 最快 |
| Read Committed(預設) | 否 | 是 | 是 | 快 |
| Repeatable Read | 否 | 否 | 是 | 中 |
| Serializable | 否 | 否 | 否 | 慢 |
多數短事務用 Read Committed 即可;轉帳類需 Repeatable Read;審計對帳類必須 Serializable。寧可保守,不可冒險。
事務設計是「安全性成本」與「效能收益」的博弈。沒有銀彈,只有基於業務風險承受能力的理性權衡。