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

MySQL 事務隔離級別設定與驗證:從 READ UNCOMMITTED 到 SERIALIZABLE 完整指南

     編輯:MySQL 綜合教學

MySQL 事務隔離級別設定與驗證:從 READ UNCOMMITTED 到 SERIALIZABLE 完整指南

事務隔離級別決定了併發事務間的可見性邊界。MySQL/InnoDB 支援 SQL-92 標準四級隔離,預設 REPEATABLE READ。本文整理設定指令、行為差異、驗證實驗與選型建議。

四大隔離級別對比

隔離級別髒讀不可重複讀幻讀InnoDB 實現機制典型場景
READ UNCOMMITTED✅ 可能✅ 可能✅ 可能無鎖讀,直接讀最新版本極高併發、可容忍髒讀(如日誌統計)
READ COMMITTED❌✅ 可能✅ 可能每次一致性讀建立新 Read ViewOracle/PostgreSQL 預設、需見最新提交
REPEATABLE READ❌❌❌ (MVCC + Next-Key Lock)事務啟動建立 Read View,全程複用MySQL/InnoDB 預設、大多數業務
SERIALIZABLE❌❌❌ (鎖表/間隙鎖)隱式加共享鎖,強制串行極嚴格一致性、報表/結算

設定與查看指令

會話級(當前連線生效)

-- 查看當前隔離級別
SELECT @@transaction_isolation;
-- 或
SELECT @@tx_isolation;

-- 設定當前會話隔離級別
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

全域級(新連線生效,需重連)

SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-- 永久生效寫入 my.cnf
[mysqld]
transaction-isolation=REPEATABLE-READ

事務級(單次事務指定)

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
-- 事務邏輯
COMMIT;

驗證實驗:幻讀與 MVCC

準備

CREATE TABLE t (id INT PRIMARY KEY, val INT) ENGINE=InnoDB;
INSERT INTO t VALUES (1,10),(2,20),(3,30);

實驗 1:REPEATABLE READ 防幻讀(Next-Key Lock)

-- 會話 A
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT * FROM t WHERE id > 0;  -- 見 1,2,3

-- 會話 B (另一終端)
INSERT INTO t VALUES (4,40);
COMMIT;

-- 會話 A 再次查詢
SELECT * FROM t WHERE id > 0;  -- 仍見 1,2,3 (無幻讀)
COMMIT;

實驗 2:READ COMMITTED 會見到幻讀

-- 會話 A
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
SELECT * FROM t WHERE id > 0;  -- 見 1,2,3

-- 會話 B
INSERT INTO t VALUES (4,40);
COMMIT;

-- 會話 A 再次查詢
SELECT * FROM t WHERE id > 0;  -- 見 1,2,3,4 (幻讀出現)
COMMIT;

InnoDB 核心機制:MVCC + Next-Key Lock

  • MVCC(多版本並發控制):Undo Log 構建版本鏈,Read View 判定可見性
  • Read View:包含 trx_ids(活躍事務 ID 列表)、low_limit_id、up_limit_id、creator_trx_id
  • REPEATABLE READ:事務首次 SELECT 建立 Read View,後續複用 → 同一事務多次查詢結果一致
  • READ COMMITTED:每次 SELECT 重建 Read View → 能見到其他事務提交的新版本
  • Next-Key Lock:記錄鎖 + 間隙鎖,封鎖區間插入,解決幻讀

選型建議

業務特徵建議隔離級別理由
一般 OLTP(電商、支付、用戶中心)REPEATABLE READ (預設)平衡一致性與併發,InnoDB 優化最成熟
需即時見最新提交(即時儀表板、庫存查詢)READ COMMITTED配合 binlog_format=ROW 避免主從不一致
統計報表、離線分析、可容忍髒讀READ UNCOMMITTED無鎖讀,最高併發,但極少用
月結/日結、財務對帳、嚴格串行需求SERIALIZABLE效能極差,僅極少數場景

常見誤區

  • 以為 RR 完全無幻讀:InnoDB 用 Next-Key Lock 解決「當前讀」幻讀,但「快照讀」(普通 SELECT) 靠 MVCC 天然無幻讀。鎖定讀 SELECT ... FOR UPDATE 才加 Next-Key Lock
  • 以為設定隔離級別需重啟:會話級/事務級即時生效,僅全域級需新連線
  • 忽略 Binlog 格式影響:binlog_format=STATEMENT 下,READ COMMITTED 可能導致主從不一致,生產必須 ROW 格式
隔離級別是併發與一致性的天平。預設 REPEATABLE READ 滿足 95% 以上業務。若確需 READ COMMITTED,務必配合 binlog_format=ROW 並充分測試。不要輕易調整全域隔離級別,會話級按需設定更安全。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved