Mysql 的 Repeatable Read & 幻讀
wordsCount: 621
readingTime: 2 mins
viewers:
此篇討論Mysql RR下,預設解決了哪些幻讀,哪些沒解決?如何處理剩下的幻讀問題
定義
快照讀 :
- select
當前讀 :
- select xxx lock in share mode
- select xxx for update
- insert (先select 當前)
- update (先select 當前)
- delete (先select 當前)
Mysql RR 的實現= MVCC + Next-Key Lock
幻讀可能性
1.交易都是快照讀=>不會幻讀
| Transaction A | Transaction B |
|---|---|
初始狀態 (V0): user { Ian, 21 } |
|
Start |
Start |
Select user Where age > 20 (A);/* 結果只有 Ian */ |
|
Insert user { Mark, 30 } (V1);Commit; |
|
Select user Where age > 20 (B);/* 結果只有 Ian */ |
|
Commit; |
|
| 核心邏輯:因為 Select 只被允許讀取事務 B 開始時的版號,也就是只會讀取到『V0』的資料狀態。 |
2. 交易一開始就當前讀,所以next-key lock=>不會幻讀
| Transaction A | Transaction B |
|---|---|
初始狀態: user { Mark, 2 } |
|
Start |
Start |
Select user Where age < 5 For update (A);→ 觸發鎖範圍 (-∞, 5) |
|
Insert user { CC, 8 }Ok (8 不在鎖範圍內) |
|
Insert user { AA, 4 }❌ 卡住! (4 在鎖範圍內) |
|
Insert user { BB, 3 }❌ 卡住! (3 在鎖範圍內) |
|
Commit |
|
Select user Where age < 5 For update (B) |
|
Commit |
|
| 最終結果:(A) 查詢結果只有 Mark(B) 查詢結果只有 Mark |
3. 幻讀(先用快照讀,後用隱性當前讀破壞版本,又用快照讀發現資料改變
| Transaction A | Transaction B |
|---|---|
初始狀態 (V0): user { Ian, 21 } |
|
Start |
Start |
Select user Where age > 20 (A);/* 讀取 V0:只有 Ian */ |
|
Insert user { Mark, 30 } (V1);Commit; |
|
Select user Where age > 20 (B);/* 讀取 V0:只有 Ian */ |
|
Update user set name = 'MarK' Where age = 30;/* 關鍵: 成功更新了本來「看不見」的 V1 資料 */ |
|
Select user Where age > 20 (C);/* 讀取 V1:出現了 Ian 與 Mark */ |
|
Commit; |
查詢結果摘要:
- (A) select:結果只有 Ian
- (B) select:結果只有 Ian
- (C) select:結果有 Ian, Mark
總結
開啟交易後
|
|
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
交易隔離等級
What we talk this ? 在不同的商業模式下,注重的核心不同,有些要速度,可接受不準確,有些要資料精準,可接受慢一點
2026-4-12
交易併發問題
What we talk this ? 介紹基本定義,沒搞清楚就不知道交易隔離等級解決了什麼問題 交易併發常見問題 定義: 問題類型 定義
2026-4-12
Sponsor
Wechat
Alipay