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

MySQL InnoDB 四大事務隔離級別與髒讀、不可重複讀、幻讀現象對照表

     編輯:MySQL 綜合教學

事務隔離級別與並發異常對應關係

隔離級別髒讀不可重複讀幻讀鎖/實現機制
READ UNCOMMITTED
(讀未提交)
✅ 發生✅ 發生✅ 發生無鎖,直接讀取內存數據
READ COMMITTED
(讀已提交)
❌ 避免✅ 發生✅ 發生行鎖(讀取瞬間加鎖即釋放)
REPEATABLE READ
(可重複讀) InnoDB 默認
❌ 避免❌ 避免⚠️ 可能發生
(InnoDB 用 Next-Key Lock 避免)
MVCC 快照讀 + Next-Key Lock (當前讀)
SERIALIZABLE
(串行化)
❌ 避免❌ 避免❌ 完全避免表鎖/範圍鎖,強制串行執行

三大異常現象定義

  • 髒讀:事務 A 讀取事務 B **未提交** 的修改數據
  • 不可重複讀:事務 A 同一查詢在事務 B **提交修改** 前後結果不一致(針對 UPDATE/DELETE)
  • 幻讀:事務 A 同一範圍查詢在事務 B **提交插入** 前後結果集行數變化(針對 INSERT)

InnoDB 關鍵實現細節

  1. RR 級別默認:tx_isolation = REPEATABLE-READ
  2. MVCC 快照讀:普通 SELECT 讀取歷史版本鏈,**不加鎖、不阻塞**
  3. 當前讀加鎖:SELECT ... LOCK IN SHARE MODE、SELECT ... FOR UPDATE、INSERT/UPDATE/DELETE 讀取最新版本並加鎖
  4. Next-Key Lock:記錄鎖 + 間隙鎖,解決 RR 級別幻讀問題
  5. 一致性非鎖定讀:RR 級別下普通 SELECT 見到事務開始時的數據庫快照

隔離級別設置

-- 會話級別
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-- 全局級別 (需重啟或配置文件)
[mysqld]
transaction-isolation = REPEATABLE-READ

查看當前隔離級別

SELECT @@tx_isolation;
-- 或
SHOW VARIABLES LIKE 'tx_isolation';
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved