MySQL四種事務(wù)隔離級(jí)別及其適用場景深入理解
前言
在高并發(fā)系統(tǒng)中,事務(wù)隔離級(jí)別的選擇,直接決定了系統(tǒng)的一致性、并發(fā)能力以及死鎖風(fēng)險(xiǎn)。
選得好,系統(tǒng)穩(wěn)定又高效;選得不好,線上問題層出不窮。
本文將從并發(fā)問題出發(fā),系統(tǒng)講解 MySQL(InnoDB)支持的四種事務(wù)隔離級(jí)別,并結(jié)合實(shí)際業(yè)務(wù)場景告訴你:
?? 每種隔離級(jí)別到底適合干什么?
一、事務(wù)隔離級(jí)別到底在解決什么問題?
在并發(fā)環(huán)境下,多個(gè)事務(wù)同時(shí)讀寫同一份數(shù)據(jù),如果沒有隔離機(jī)制,就會(huì)出現(xiàn)各種“詭異問題”。
最常見的三類并發(fā)問題如下:
| 并發(fā)問題 | 含義 |
|---|---|
| 臟讀(Dirty Read) | 讀到了其他事務(wù)尚未提交的數(shù)據(jù) |
| 不可重復(fù)讀(Non-repeatable Read) | 同一事務(wù)內(nèi),多次讀取同一行數(shù)據(jù),結(jié)果不一致 |
| 幻讀(Phantom Read) | 同一事務(wù)內(nèi),多次查詢,結(jié)果行數(shù)發(fā)生變化(新增或刪除) |
?? 事務(wù)隔離級(jí)別,本質(zhì)上就是:數(shù)據(jù)庫為了解決這些問題所做的權(quán)衡方案。
二、MySQL(InnoDB)支持的四種隔離級(jí)別
MySQL 遵循 SQL 標(biāo)準(zhǔn),提供了四種事務(wù)隔離級(jí)別:
- READ UNCOMMITTED(讀未提交)
- READ COMMITTED(讀已提交)
- REPEATABLE READ(可重復(fù)讀) ← MySQL 默認(rèn)
- SERIALIZABLE(可串行化)
三、READ UNCOMMITTED(讀未提交)
特點(diǎn)
- 可以讀取到 其他事務(wù)尚未提交的數(shù)據(jù)
- 幾乎不做任何隔離
- 查詢不加鎖,性能最高
會(huì)出現(xiàn)的問題
- ? 臟讀
- ? 不可重復(fù)讀
- ? 幻讀
適用場景
?? 幾乎不適用于任何線上業(yè)務(wù)
理論上只適合:
- 對數(shù)據(jù)一致性完全不敏感
- 只追求極致性能
- 數(shù)據(jù)很快會(huì)被覆蓋的場景(如某些臨時(shí)統(tǒng)計(jì))
?? 現(xiàn)實(shí)中基本沒人用
四、READ COMMITTED(讀已提交)
特點(diǎn)
- 每次查詢只能讀到 已經(jīng)提交的數(shù)據(jù)
- 解決了“臟讀”問題
- 但同一事務(wù)內(nèi),多次查詢可能讀到不同結(jié)果
Oracle 默認(rèn)使用的就是 RC。
仍然存在的問題
- ? 不可重復(fù)讀
- ? 幻讀(MySQL 中仍可能發(fā)生)
適用場景
- 對讀一致性要求不高
- 希望減少鎖沖突、提升并發(fā)能力
- OLTP 系統(tǒng)中非常常見
例如:
商品列表、庫存展示,只要求看到“當(dāng)前最新提交值”。
?? 很多互聯(lián)網(wǎng)公司會(huì)把 MySQL 從 RR 調(diào)整為 RC,以減少 next-key lock 帶來的副作用。
五、REPEATABLE READ(可重復(fù)讀,MySQL 默認(rèn))
特點(diǎn)
- 在同一事務(wù)中,多次讀取結(jié)果保持一致
- 解決了“不可重復(fù)讀”
- MySQL 的 RR 實(shí)現(xiàn)還能解決幻讀
這是一個(gè)重點(diǎn)。
為什么 MySQL 的 RR 比標(biāo)準(zhǔn)更強(qiáng)?
MySQL InnoDB 通過:
- MVCC(多版本并發(fā)控制)
- Next-Key Lock(記錄鎖 + 間隙鎖)
在 RR 隔離級(jí)別下 避免了幻讀問題。
這是 MySQL 對 SQL 標(biāo)準(zhǔn)的“增強(qiáng)實(shí)現(xiàn)”。
適用場景
- 對事務(wù)內(nèi)一致性要求較高
- 訂單、支付、賬務(wù)等核心業(yè)務(wù)
- 需要保證“同一事務(wù)內(nèi),數(shù)據(jù)不變”
例如:
支付過程中,多次讀取訂單金額,必須一致。
?? 這也是 MySQL 默認(rèn)選擇 RR 的原因:
在一致性和性能之間取得了較好的平衡。
六、SERIALIZABLE(可串行化)
特點(diǎn)
- 最高隔離級(jí)別
- 所有事務(wù) 串行執(zhí)行
- 讀操作也會(huì)加鎖(共享鎖)
并發(fā)問題
- ? 無臟讀
- ? 無不可重復(fù)讀
- ? 無幻讀
?? 問題全解決,但代價(jià)極大
缺點(diǎn)
- 并發(fā)能力極低
- 大量鎖等待
- 性能急劇下降
適用場景
- 金融核心系統(tǒng)
- 強(qiáng)一致性賬務(wù)校驗(yàn)
- 事務(wù)量小、執(zhí)行時(shí)間短的場景
?? 平時(shí)業(yè)務(wù)系統(tǒng)中 極少使用。
七、四種隔離級(jí)別對比(核心總結(jié)表)
| 隔離級(jí)別 | 臟讀 | 不可重復(fù)讀 | 幻讀 | 是否影響查詢 | 性能 |
|---|---|---|---|---|---|
| READ UNCOMMITTED | ? | ? | ? | 否 | ????? |
| READ COMMITTED | ? | ? | ? | 否 | ???? |
| REPEATABLE READ(默認(rèn)) | ? | ? | ?(MySQL 實(shí)現(xiàn)) | 必要時(shí) | ??? |
| SERIALIZABLE | ? | ? | ? | ?(讀寫都鎖) | ? |
?? 在 MySQL InnoDB 中,RR 已經(jīng)通過 MVCC + Next-Key Lock 解決幻讀。
八、實(shí)際項(xiàng)目中該如何選擇?
? 大多數(shù)業(yè)務(wù)系統(tǒng)(推薦)
REPEATABLE READ(默認(rèn))
- MySQL 官方默認(rèn)
- 一致性和性能平衡好
- 適合絕大多數(shù) OLTP 場景
? 高并發(fā)讀寫系統(tǒng)
READ COMMITTED
- 減少鎖沖突
- 避免大量間隙鎖
- 更容易調(diào)優(yōu)
?? 這是很多互聯(lián)網(wǎng)公司的真實(shí)選擇。
? 強(qiáng)一致性金融系統(tǒng)
SERIALIZABLE
- 串行執(zhí)行
- 絕對一致
- 只適合小事務(wù)量場景
? READ UNCOMMITTED
- 理論存在
- 實(shí)戰(zhàn)幾乎不用
九、總結(jié)
讀未提交:最快,但最危險(xiǎn)(不用) 讀已提交:高并發(fā),Oracle 默認(rèn) 可重復(fù)讀:MySQL 默認(rèn),最常用 串行化:最安全,但最慢
到此這篇關(guān)于MySQL四種事務(wù)隔離級(jí)別及其適用場景的文章就介紹到這了,更多相關(guān)MySQL事務(wù)隔離級(jí)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL語句中LEFT JOIN的ON和WHERE有什么區(qū)別
這篇文章主要介紹了SQL語句中LEFT JOIN的ON和WHERE之間的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12
解決創(chuàng)建主鍵報(bào)錯(cuò):Incorrect column specifier for
這篇文章主要介紹了解決創(chuàng)建主鍵報(bào)錯(cuò):Incorrect column specifier for column‘id‘問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
使用MySQL MySqldump命令導(dǎo)出數(shù)據(jù)時(shí)的注意事項(xiàng)
這篇文章主要介紹了使用MySQL MySqldump命令導(dǎo)出數(shù)據(jù)時(shí)的注意事項(xiàng),很實(shí)用的經(jīng)驗(yàn)總結(jié),需要的朋友可以參考下2014-07-07
MySQL億級(jí)大表安全添加字段的實(shí)戰(zhàn)指南
在面對億級(jí)數(shù)據(jù)的 MySQL 表時(shí),直接執(zhí)行 ALTER TABLE 添加字段的傳統(tǒng)方式可能會(huì)導(dǎo)致長時(shí)間的表鎖定,嚴(yán)重影響業(yè)務(wù)的正常運(yùn)行,本文將為你提供幾種安全、高效添加字段的方案,幫助你在不影響業(yè)務(wù)的情況下完成大表的字段擴(kuò)展,需要的朋友可以參考下2025-05-05

