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

5. 參考博文
MySQL事務(wù)隔離級別是保證數(shù)據(jù)一致性和并發(fā)性的重要手段。不同的隔離級別適用于不同的場景,需要根據(jù)實(shí)際情況進(jìn)行選擇。在使用事務(wù)時(shí),需要注意事務(wù)的提交和回滾,以及鎖的使用和釋放,以保證數(shù)據(jù)的正確性和系統(tǒng)的穩(wěn)定性。
到此這篇關(guān)于mysql事務(wù)隔離級別詳解的文章就介紹到這了,更多相關(guān)MySQL事務(wù)隔離級別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql 搜尋附近N公里內(nèi)數(shù)據(jù)的簡單實(shí)例
下面小編就為大家?guī)硪黄猰ysql 搜尋附近N公里內(nèi)數(shù)據(jù)的簡單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
mysql中find_in_set()函數(shù)的使用及in()用法詳解
這篇文章主要介紹了mysql中find_in_set()函數(shù)的使用以及in()用法詳解,需要的朋友可以參考下2018-07-07
MySQL錯(cuò)誤TIMESTAMP column with CURRENT_TIMESTAMP的解決方法
這篇文章主要介紹了MySQL錯(cuò)誤TIMESTAMP column with CURRENT_TIMESTAMP的解決方法,需要的朋友可以參考下2014-06-06
MySQL中pt-table-checksum實(shí)現(xiàn)主從一致性校驗(yàn)的終極方案

