mysql事務(wù)隔離級(jí)別詳解
0. 事務(wù)的概念
事務(wù)指的是一連串的集中操作指令,一個(gè)事務(wù)的執(zhí)行必須執(zhí)行完所有的動(dòng)作才能算作執(zhí)行結(jié)束。事務(wù)具有四個(gè)特點(diǎn),簡(jiǎn)記作ACID
:
A
-Atomicity: 原子性,事務(wù)的執(zhí)行必須保證所有的動(dòng)作都執(zhí)行完畢;C
-Consistency: 一致性,事務(wù)的執(zhí)行必須保證數(shù)據(jù)的一致性;I
-Isolation: 隔離性,事務(wù)的執(zhí)行必須保證數(shù)據(jù)的隔離性;D
-Durability: 持久性,事務(wù)的執(zhí)行必須保證數(shù)據(jù)的持久性。
而事務(wù)隔離級(jí)別則是在大型數(shù)據(jù)庫(kù)多個(gè)事務(wù)執(zhí)行的過(guò)程中,針對(duì)事務(wù)并行進(jìn)行的機(jī)制設(shè)計(jì),主要是圍繞Isolation
進(jìn)行設(shè)計(jì)的。
1. 三類問(wèn)題
- 臟讀
- 過(guò)程:
- 事務(wù)A正在寫某一行數(shù)據(jù),未提交;
- 事務(wù)B并行讀取該行數(shù)據(jù),用于操作;
- 事務(wù)A撤銷寫操作,這是對(duì)于事務(wù)B來(lái)說(shuō),之前的讀操作就是錯(cuò)誤的。
- 讀事務(wù)讀取了寫事務(wù)未提交的數(shù)據(jù),而造成錯(cuò)誤讀取。
- 舉例
- 小明今天發(fā)工資,一開始在財(cái)務(wù)系統(tǒng)上查詢是工資50000元,很高興地準(zhǔn)備買新電腦,但是這是財(cái)務(wù)正在敲數(shù)據(jù)的時(shí)候一時(shí)疏忽,實(shí)際上工資只有5000元,財(cái)務(wù)在審核數(shù)據(jù)準(zhǔn)備提交的時(shí)候發(fā)現(xiàn)了這個(gè)錯(cuò)誤并修改過(guò)來(lái),小明很失望。
- 這里的小明就是
讀事務(wù)
,財(cái)務(wù)就是寫事務(wù)
。
- 過(guò)程:
- 不可重復(fù)讀
- 過(guò)程:
- 事務(wù)B讀取的是數(shù)據(jù)庫(kù)中的某一行數(shù)據(jù),用于操作;
- 事務(wù)A開始對(duì)這行數(shù)據(jù)進(jìn)行寫操作并完成,數(shù)據(jù)庫(kù)的數(shù)據(jù)改變;
- 事務(wù)B再次讀該數(shù)據(jù)庫(kù)的這一行數(shù)據(jù),發(fā)現(xiàn)數(shù)據(jù)改變;
- 讀事務(wù)兩次讀同一行數(shù)據(jù),但是兩次讀取的數(shù)據(jù)并不一致。
- 舉例
- 小明和小紅打賭,這個(gè)月工資是1k,兩個(gè)人幾乎同時(shí)發(fā)出查詢請(qǐng)求,但是小明先讀取到了原始數(shù)據(jù)是1k,而財(cái)務(wù)核對(duì)之后再次修改了工資為2k,小紅在這之后才并發(fā)讀取到工資是2k,兩人認(rèn)為讀操作是并行的,同時(shí)進(jìn)行,雖然知道這中間可能是財(cái)務(wù)進(jìn)行了修改,但是兩人都認(rèn)為自己讀取的才是最終數(shù)據(jù),因此吵了起來(lái)。
- 過(guò)程:
- 幻讀
- 過(guò)程
- 事務(wù)B讀取數(shù)據(jù)庫(kù)中的一批數(shù)據(jù),用于操作;
- 事務(wù)A添加了一行數(shù)據(jù),并完成操作,數(shù)據(jù)庫(kù)的數(shù)據(jù)改變;
- 事務(wù)B再次讀該數(shù)據(jù)庫(kù)的數(shù)據(jù),發(fā)現(xiàn)這一批數(shù)據(jù)改變;
- 讀事務(wù)兩次讀取同一行數(shù)據(jù),但是兩次讀取的數(shù)據(jù)不一致。(這和
不可重復(fù)讀
操作是一致的)。 - 舉例
- 小明被領(lǐng)導(dǎo)要求,改動(dòng)財(cái)務(wù)系統(tǒng)上的ID數(shù)據(jù)格式,從A格式全都轉(zhuǎn)為B格式,小明讀取數(shù)據(jù)庫(kù)中的數(shù)據(jù)之后開始修改,這時(shí)候,財(cái)務(wù)發(fā)現(xiàn)新來(lái)了一位員工叫小紅,于是把小紅的記錄添加在財(cái)務(wù)系統(tǒng)上,ID格式依然是A格式。小明工作完成之后給領(lǐng)導(dǎo)看,領(lǐng)導(dǎo)卻發(fā)現(xiàn)有一個(gè)人的數(shù)據(jù)沒(méi)有改過(guò)來(lái),很是惱火,把小明批評(píng)了一番。
- 幻讀和不可重復(fù)讀的區(qū)別
- 幻讀是針對(duì)同一批數(shù)據(jù),不可重復(fù)讀針對(duì)的是同一行數(shù)據(jù)
- 過(guò)程
2. 事務(wù)隔離級(jí)別
- 讀未提交(read uncommitted)
- 一個(gè)事務(wù)在寫某一行數(shù)據(jù)的時(shí)候,允許其他事務(wù)并行讀取該行數(shù)據(jù),但是不允許寫該行數(shù)據(jù);
- 允許多個(gè)事務(wù)并行讀取數(shù)據(jù)庫(kù)中的數(shù)據(jù),但是不允許并行寫入某一行數(shù)據(jù);
- 可能會(huì)出現(xiàn)
臟讀
: - 解決方案:排他鎖
讀已提交(read committed)
- 一個(gè)事務(wù)在寫某一行數(shù)據(jù)的時(shí)候,不允許其他事務(wù)讀或者寫該行數(shù)據(jù);
- 允許多個(gè)事務(wù)并行讀取數(shù)據(jù)庫(kù)的數(shù)據(jù);
- 可能都造成
不可重復(fù)讀
:
可重復(fù)讀(repeatable read)
- 一個(gè)事務(wù)在讀數(shù)據(jù)的時(shí)候,其他事務(wù)不允許寫,可以讀。
- 一個(gè)事務(wù)在寫數(shù)據(jù)的時(shí)候,其他事務(wù)不可以讀或者寫。
- 可能會(huì)造成
幻讀
: - MySQL默認(rèn)的隔離級(jí)別。
串行化(serializable)
- 一個(gè)事務(wù)一個(gè)事務(wù)串行執(zhí)行,不允許任何事物并行;
- 能夠解決
幻讀
、不可重復(fù)讀
、臟讀
的問(wèn)題; - 成本高,一般不適用
3. 操作指令
查看當(dāng)前的隔離級(jí)別
SELECT @@tx_isolation;
設(shè)置隔離級(jí)別
set [glogal | session] transaction isolation level 隔離級(jí)別名稱;//方式1 set tx_isolation='隔離級(jí)別名稱';//方式2 ``
4. 總結(jié)
對(duì)前期的事務(wù)隔離級(jí)別做一個(gè)表格梳理

5. 參考博文
MySQL事務(wù)隔離級(jí)別是保證數(shù)據(jù)一致性和并發(fā)性的重要手段。不同的隔離級(jí)別適用于不同的場(chǎng)景,需要根據(jù)實(shí)際情況進(jìn)行選擇。在使用事務(wù)時(shí),需要注意事務(wù)的提交和回滾,以及鎖的使用和釋放,以保證數(shù)據(jù)的正確性和系統(tǒng)的穩(wěn)定性。
到此這篇關(guān)于mysql事務(wù)隔離級(jí)別詳解的文章就介紹到這了,更多相關(guān)MySQL事務(wù)隔離級(jí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
windows系統(tǒng)mysql壓縮包版本安裝過(guò)程
這篇文章主要介紹了windows系統(tǒng)mysql壓縮包版本安裝過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03mysql實(shí)現(xiàn)批量修改字段null值改為空字符串
這篇文章主要介紹了mysql實(shí)現(xiàn)批量修改字段null值改為空字符串,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2022-08-08教你如何讓spark?sql寫mysql的時(shí)候支持update操作
spark提供了一個(gè)枚舉類,用來(lái)支撐對(duì)接數(shù)據(jù)源的操作模式,本文重點(diǎn)給大家介紹如何讓spark?sql寫mysql的時(shí)候支持update操作,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-02-02Linux下MySQL安裝配置 MySQL配置參數(shù)詳解
Linux下MySQL安裝配置 MySQL配置參數(shù)詳解,在linux下配置mysql的朋友可以參考下。2011-07-07MySQL可直接使用的查詢表的列信息(實(shí)現(xiàn)方案)
本文介紹了如何使用SQL快速將下劃線命名的表字段轉(zhuǎn)換為駝峰命名格式,包括確定下劃線位置、找到第一個(gè)字符、截取并拼接字符串等步驟,通過(guò)使用LOCATE、CONCAT、UCASE和LOWER等函數(shù),可以實(shí)現(xiàn)高效的字段命名轉(zhuǎn)換,感興趣的朋友跟隨小編一起看看吧2025-01-01MySQL數(shù)據(jù)表使用的SQL語(yǔ)句整理
這篇文章主要介紹了MySQL數(shù)據(jù)表使用的SQL語(yǔ)句整理,文章基于MySQL的相關(guān)資料展開舉例說(shuō)明,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05一文搞清楚MySQL count(*)、count(1)、count(col)區(qū)別
本文主要介紹了MySQL count(*)、count(1)、count(col)區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03如何解決mysqlimport: Error: 13, Can''t get stat of 的問(wèn)題
本篇文章是對(duì)解決mysqlimport: Error: 13, Can't get stat of問(wèn)題的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06navicat中創(chuàng)建存儲(chǔ)過(guò)程、觸發(fā)器和使用游標(biāo)的簡(jiǎn)單實(shí)例(圖文)
這篇文章主要介紹了navicat中創(chuàng)建存儲(chǔ)過(guò)程、觸發(fā)器和使用游標(biāo)的簡(jiǎn)單實(shí)例,需要的朋友可以參考下2017-02-02