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

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