交易併發問題
wordsCount: 500
readingTime: 1 min
viewers:
What we talk this ?
介紹基本定義,沒搞清楚就不知道交易隔離等級解決了什麼問題
交易併發常見問題
定義:
| 問題類型 | 定義 | 直覺理解 | PostgreSQL RR | MySQL RR | 備註 |
|---|---|---|---|---|---|
| Dirty Read | 讀到未提交資料 | 別人還沒 commit 你就看到 | ❌不會 | ❌不會 | 兩者皆透過 MVCC 避開。 |
| Non-Repeatable Read | 同行讀取結果不同 | 原本桌上的蘋果被換了 | ❌不會 | ❌不會 | 皆透過 Snapshot (快照) 鎖定該行版本。 |
| Phantom Read | 範圍查詢結果行數增減 | 桌上突然多了一顆蘋果 | ❌不會 | ⚠️可能發生 | PG 靠快照完全封鎖;MySQL 僅在加鎖讀時靠 Gap Lock 防禦,純 Select 有破綻。 |
| Write Skew | 跨行邏輯衝突 | 各自檢查合法,合併結果違法 | ❗會發生 | ❗會發生 | RR 級別的通病,除非提升至Serializable或手動加鎖。 |
Write Skew 寫偏差
「每個 transaction 的判斷都正確,但一起執行就違反規則」
當你有「條件約束」時:
例如:
- 至少一人在線
- 餘額不能為負(跨帳戶)
- 名額限制(例如最多 N 人)
👉 且條件是「跨多筆資料」
例子:
至少要有一位醫生值班
| doctor | on_call |
|---|---|
| A | true |
| B | true |
兩個交易同時發生
|
|
| doctor | on_call |
|---|---|
| A | false |
| B | false |
✔️ 方法 1:用 Serializable
|
|
✔️ 方法 2:手動加鎖 相關列鎖住
|
|
Table of Contents
Related Posts
設計模式-工廠模式
Factory -工廠模式 分類 建立模式-Creational Patterns 主要角色 Product (產品介面)、Concrete Product (具體產品
2026-4-12
設計模式-策略模式
Strategy-策略模式 分類 行為模式-Behavioral Patterns 主要角色 Strategy (策略介面)、Concret
2026-4-12
MySQL和PostgreSQL交易快照比較
此篇討論Mysql和PostgreSQL的快照機制 MVCC (Multi-Version Concurrency Control) 多版本併發控制,核心在於使用版本來代替鎖來
2026-4-12
Mysql 的 Repeatable Read & 幻讀
此篇討論Mysql RR下,預設解決了哪些幻讀,哪些沒解決?如何處理剩下的幻讀問題 定義 快照讀 : select 當前讀
2026-4-12
交易隔離等級
What we talk this ? 在不同的商業模式下,注重的核心不同,有些要速度,可接受不準確,有些要資料精準,可接受慢一點
2026-4-12
Sponsor
Wechat
Alipay