首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 一致性讀深度研究:RR/RC 隔離級別差異、事務啟動時間點、mysqldump 實戰陷阱

     編輯:MySQL 綜合教學

核心定義

一致性讀 = 快照讀 = MVCC 讀已提交數據,非阻塞。異常:本事務內修改的未提交數據可讀(當前讀)。

RR vs RC 一致性讀差異

隔離級別快照建立時間點特點
REPEATABLE READ (默認)事務第一條語句執行時(非 BEGIN)事務級多版本,單一 ReadView,支持可重複讀
READ COMMITTED每條 SELECT 執行時語句級多版本,每查詢新建 ReadView,代價更高

實驗驗證 RR 快照時間點

實驗 1:BEGIN 非啟動點

Session A: BEGIN; SELECT * FROM t1; -- 空
Session B: INSERT INTO t1 VALUES(1,1); COMMIT;
Session A: SELECT * FROM t1; -- 仍空(快照在第一條 SELECT 前)

實驗 2:第一條語句失敗也建立快照

Session A: SET i=1; -- 報錯
Session B: INSERT ... COMMIT;
Session A: SELECT * FROM t1; -- 仍空

實驗 3:第一條語句在 INSERT 前

Session A: SELECT * FROM t1; -- 空
Session B: INSERT ... COMMIT;
Session A: SELECT * FROM t1; -- 仍空

實驗 4:本事務修改可見

Session A: BEGIN; SELECT ...; UPDATE t1 SET c2=100 WHERE c1=1; SELECT ...; -- 可見 100
-- UPDATE 為當前讀,加鎖讀最新版本

強制事務啟動即建立快照

START TRANSACTION WITH CONSISTENT SNAPSHOT;
-- 僅 RR 隔離級別有效,等價於 START TRANSACTION; SELECT 1 FROM any_innodb_table;

當前讀 vs 一致性讀

  • 一致性讀:普通 SELECT,讀 Undo 已提交版本,無鎖(除 MDL)
  • 當前讀:UPDATE/DELETE/SELECT ... FOR UPDATE/LOCK IN SHARE MODE,讀最新版本,加行鎖+GAP 鎖(RR)

mysqldump --single-transaction 陷阱

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */;
SAVEPOINT sp; SELECT * FROM t1; ROLLBACK TO sp;
SAVEPOINT sp; SELECT * FROM t2; ROLLBACK TO sp; ...

DDL 干擾風險

  1. DDL 在 SAVEPOINT 前 → 該表導出時報錯 Table definition changed
  2. DDL 在 SAVEPOINT 後、ROLLBACK TO 前 → MDL 鎖衝突,雙方阻塞
  3. DDL 在 ROLLBACK TO 後 → 無影響

原因:ALTER/DROP/RENAME/TRUNCATE TABLE 破壞 MVCC 構建一致性快照的能力(官方文檔明確聲明)。

Oracle 對比

  • 語句級讀一致性:強制實現
  • 事務級讀一致性:僅 SERIALIZABLE/READ ONLY 支持
  • 無 READ UNCOMMITTED、無 RR(SERIALIZABLE 實現可重複讀)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved