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

MySQL 事務隔離級別完整解析:原理、現象與選型指南

     編輯:MySQL 綜合教學

核心概念

事務隔離級別是為了在併發場景下保證資料讀取正確性,同時平衡效能而定義的四個標準級別。隔離級別越高,併發效能通常越低。

四大標準隔離級別

隔離級別髒讀不可重複讀幻讀鎖策略特徵
READ UNCOMMITTED
(讀未提交)
✅ 可能✅ 可能✅ 可能無共享鎖,效能最高
READ COMMITTED
(讀已提交)
❌ 不可能✅ 可能✅ 可能語句級一致性讀,RC
REPEATABLE READ
(可重複讀)
❌ 不可能❌ 不可能✅ 可能事務級一致性讀,RR(InnoDB 預設)
SERIALIZABLE
(串行化)
❌ 不可能❌ 不可能❌ 不可能全表鎖/範圍鎖,效能最低

三大異常現象定義

  • 髒讀:事務 A 讀到事務 B 未提交的修改,B 回滾後 A 讀到的資料不存在
  • 不可重複讀:事務 A 同一查詢在事務內前後兩次結果不一致(B 修改並提交)
  • 幻讀:事務 A 同一範圍查詢前後行數不一致(B 新增/刪除並提交)

MySQL/InnoDB 實現機制

預設級別:REPEATABLE READ

SHOW VARIABLES LIKE 'transaction_isolation';
-- 可動態修改
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;

MVCC 多版本併發控制

  • RR 級別下,InnoDB 通過 Read View + Undo Log 實現事務級一致性讀,避免不可重複讀
  • 但無法完全解決幻讀:快照讀不加鎖會有幻讀;當前讀(SELECT ... FOR UPDATE/LOCK IN SHARE MODE)加Next-Key Lock(記錄鎖+間隙鎖)防止幻讀

RC 級別差異

  • 每條語句建立新 Read View,看到最新提交版本
  • 僅用 Record Lock,無 Gap Lock,併發度較高
  • 主從複制建議用 RC + ROW 格式

選型建議

場景建議級別理由
高併發讀多寫少、可容忍幻讀READ COMMITTED鎖較少、併發高、主從一致性好
金融核心、強一致性要求REPEATABLE READ預設、事務級一致性、配合 Next-Key Lock 防幻讀
極簡報表、可接受鎖等待SERIALIZABLE完全串行、無併發異常
緩存刷新、日誌寫入等非關鍵READ UNCOMMITTED效能極致、業務允許髒讀

實驗驗證模板

-- 會話 A
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT * FROM t WHERE id > 10; -- 快照讀
-- 會話 B 插入 id=15 提交
SELECT * FROM t WHERE id > 10; -- 仍不見 id=15(RR 快照讀)
SELECT * FROM t WHERE id > 10 FOR UPDATE; -- 當前讀,會見到/加鎖阻塞
COMMIT;

總結

  • 隔離級別本質是鎖粒度與 MVCC 可見性的權衡
  • InnoDB RR 是唯一支援 Next-Key Lock 防幻讀的預設引擎實現
  • 生產多用 RC 或 RR,視業務一致性與併發需求權衡
  • 避免長事務,縮小鎖持有時間
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved