MySQL事務(wù)機制和隔離級別使用方式
MySQL 的事務(wù)機制是保證數(shù)據(jù)庫操作一致性和可靠性的核心特性,而隔離級別則用于平衡事務(wù)并發(fā)時的性能與數(shù)據(jù)一致性。
以下是詳細解析:
一、事務(wù)的四大特性(ACID)
事務(wù)(Transaction)是一組不可分割的 SQL 操作,要么全部成功,要么全部失敗,核心依賴四大特性:
原子性(Atomicity):
- 事務(wù)中的操作要么全部執(zhí)行,要么全部回滾(如轉(zhuǎn)賬時,扣款和收款必須同時成功或失?。?。
- 實現(xiàn)依賴:Undo Log(記錄操作前的狀態(tài),用于回滾)。
一致性(Consistency):
- 事務(wù)執(zhí)行前后,數(shù)據(jù)從一個合法狀態(tài)轉(zhuǎn)換到另一個合法狀態(tài)(如轉(zhuǎn)賬后總金額不變)。
- 由原子性、隔離性、持久性共同保證,部分依賴業(yè)務(wù)邏輯。
隔離性(Isolation):
- 多個事務(wù)并發(fā)執(zhí)行時,彼此的操作互不干擾(如避免同時修改同一行數(shù)據(jù)導(dǎo)致的混亂)。
- 實現(xiàn)依賴:鎖機制(行鎖、表鎖)和 MVCC(多版本并發(fā)控制)。
持久性(Durability):
- 事務(wù)提交后,修改永久保存(即使數(shù)據(jù)庫崩潰也不丟失)。
- 實現(xiàn)依賴:Redo Log(記錄操作后的狀態(tài),用于崩潰恢復(fù))。
二、事務(wù)的隔離級別(SQL 標準定義)

MySQL 的隔離級別從低到高分為 4 種,級別越高,并發(fā)控制越嚴格,但性能開銷越大:
| 隔離級別 | 臟讀(Dirty Read) | 不可重復(fù)讀(Non-repeatable Read) | 幻讀(Phantom Read) | 說明 |
|---|---|---|---|---|
| 讀未提交(Read Uncommitted) | 可能發(fā)生 | 可能發(fā)生 | 可能發(fā)生 | 一個事務(wù)可讀取另一個未提交的修改,極少使用(如實時數(shù)據(jù)監(jiān)控場景)。 |
| 讀已提交(Read Committed) | 不會發(fā)生 | 可能發(fā)生 | 可能發(fā)生 | 一個事務(wù)只能讀取另一個已提交的修改(Oracle 默認級別)。 |
| 可重復(fù)讀(Repeatable Read) | 不會發(fā)生 | 不會發(fā)生 | 幾乎不發(fā)生 | 事務(wù)中多次讀取同一數(shù)據(jù)結(jié)果一致(MySQL InnoDB 默認級別)。 |
| 串行化(Serializable) | 不會發(fā)生 | 不會發(fā)生 | 不會發(fā)生 | 事務(wù)串行執(zhí)行,完全避免并發(fā)問題,但性能極低(僅用于嚴格數(shù)據(jù)一致性場景)。 |
三、各隔離級別的典型場景與實現(xiàn)
1. 讀未提交(Read Uncommitted)
- 場景:幾乎不使用,僅適用于允許臨時臟數(shù)據(jù)的極端場景(如實時統(tǒng)計)。
- 問題:事務(wù) A 修改數(shù)據(jù)未提交,事務(wù) B 讀取到該 “臟數(shù)據(jù)”,若 A 回滾,B 讀取的是無效數(shù)據(jù)。
2. 讀已提交(Read Committed)
- 場景:大多數(shù)互聯(lián)網(wǎng)應(yīng)用(如電商訂單查詢,允許讀取最新已提交數(shù)據(jù))。
- 解決臟讀:通過行鎖保證,事務(wù) A 修改數(shù)據(jù)時加鎖,事務(wù) B 只能讀取 A 提交后的數(shù)據(jù)。
- 問題:不可重復(fù)讀 —— 事務(wù) B 兩次讀取同一行,期間事務(wù) A 修改并提交,導(dǎo)致 B 兩次結(jié)果不同。
3. 可重復(fù)讀(Repeatable Read,MySQL 默認)
- 場景:金融、支付等需保證多次讀取一致性的場景(如對賬時多次查詢同一訂單金額)。
- 解決不可重復(fù)讀:通過 MVCC 實現(xiàn),事務(wù)啟動時生成數(shù)據(jù)快照,后續(xù)讀取基于快照,不受其他事務(wù)提交影響。
- 對幻讀的優(yōu)化:InnoDB 通過 “間隙鎖(Gap Lock)”+“臨鍵鎖(Next-Key Lock)”,幾乎避免幻讀(特殊場景仍可能發(fā)生,但實際使用中可忽略)。
4. 串行化(Serializable)
- 場景:數(shù)據(jù)一致性要求極高的場景(如銀行核心交易)。
- 實現(xiàn):強制事務(wù)按順序執(zhí)行(加表級鎖),完全禁止并發(fā),性能極低。
四、MySQL 中設(shè)置與查看隔離級別
1. 查看當(dāng)前隔離級別
-- MySQL 8.0+ SELECT @@transaction_isolation; -- MySQL 5.7及以下 SELECT @@tx_isolation;
2. 設(shè)置隔離級別(當(dāng)前會話或全局)
-- 設(shè)置當(dāng)前會話隔離級別 SET SESSION TRANSACTION ISOLATION LEVEL 隔離級別名稱; -- 設(shè)置全局隔離級別(需重新連接生效) SET GLOBAL TRANSACTION ISOLATION LEVEL 隔離級別名稱; -- 示例:設(shè)置當(dāng)前會話為讀已提交 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
五、事務(wù)控制語句
- 開啟事務(wù):
START TRANSACTION;或BEGIN; - 提交事務(wù):
COMMIT;(使修改永久生效) - 回滾事務(wù):
ROLLBACK;(放棄所有修改,恢復(fù)到事務(wù)開始前狀態(tài)) - 保存點:
SAVEPOINT 保存點名稱;(事務(wù)中設(shè)置中間點,可回滾到指定點)
START TRANSACTION; UPDATE account SET balance = balance - 100 WHERE id = 1; SAVEPOINT sp1; -- 設(shè)置保存點 UPDATE account SET balance = balance + 100 WHERE id = 2; ROLLBACK TO sp1; -- 回滾到保存點(僅撤銷第二條更新) COMMIT;
六、面試核心考點
- 默認隔離級別:MySQL InnoDB 默認是可重復(fù)讀(Repeatable Read),這是與其他數(shù)據(jù)庫(如 Oracle 默認讀已提交)的重要區(qū)別。
- MVCC 與隔離級別的關(guān)系:MVCC 是實現(xiàn)可重復(fù)讀和讀已提交的核心機制,通過數(shù)據(jù)多版本快照避免加鎖阻塞。
- 隔離級別與性能權(quán)衡:級別越高,一致性越好,但并發(fā)性能越差,實際應(yīng)用中通常選擇讀已提交或可重復(fù)讀。
- 幻讀的處理:InnoDB 在可重復(fù)讀級別通過間隙鎖減少幻讀,而串行化級別完全避免幻讀。
理解事務(wù)機制和隔離級別,是設(shè)計高并發(fā)、高可靠數(shù)據(jù)庫應(yīng)用的基礎(chǔ),尤其在金融、電商等對數(shù)據(jù)一致性要求嚴格的場景中至關(guān)重要。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
mysql 8.0.16 winx64及Linux修改root用戶密碼 的方法
這篇文章主要介紹了mysql 8.0.16 winx64及Linux修改root用戶密碼 的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07
Mysql Binlog數(shù)據(jù)查看的方法詳解
這篇文章主要介紹了Mysql Binlog數(shù)據(jù)查看的方法詳解,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-07-07
MySQL數(shù)據(jù)庫子查詢?sub?query
這篇文章主要介紹了MySQL數(shù)據(jù)庫子查詢?sub?query,子查詢指嵌套查詢下層的程序模塊,當(dāng)一個查詢是另一個查詢的條件的時候,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下下面文章內(nèi)容介紹2022-06-06
MySql 緩存查詢原理與緩存監(jiān)控和索引監(jiān)控介紹
這篇文章主要介紹了MySql 緩存查詢原理與緩存監(jiān)控和索引監(jiān)控,需要的朋友可以參考下2021-07-07
Mysql遷移到TiDB雙寫數(shù)據(jù)庫兜底方案詳解
這篇文章主要為大家介紹了Mysql遷移到TiDB雙寫數(shù)據(jù)庫兜底方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01

