主頁 > 知識(shí)庫 > 詳解MySQL 數(shù)據(jù)庫隔離級別與MVCC

詳解MySQL 數(shù)據(jù)庫隔離級別與MVCC

熱門標(biāo)簽:啥是企業(yè)400電話辦理 曲靖移動(dòng)外呼系統(tǒng)公司 外呼系統(tǒng)打電話上限是多少 電話外呼系統(tǒng)改號(hào) 武漢網(wǎng)絡(luò)外呼系統(tǒng)服務(wù)商 怎樣在地圖標(biāo)注銷售區(qū)域 地圖標(biāo)注費(fèi)用是多少 百應(yīng)電話機(jī)器人優(yōu)勢 南昌三維地圖標(biāo)注

Mysql是我們?nèi)粘Ia(chǎn)與學(xué)習(xí)中最常接觸到的數(shù)據(jù)庫之一,今天講一講在Mysql(或者說其他類似的數(shù)據(jù)庫)中存在的隔離級別以及用來提高效率的多版本并發(fā)控制(MVCC)。

一、隔離級別

首先我們需要提到一個(gè)概念:事務(wù)。什么是事務(wù)?事務(wù)就是完成一個(gè)基礎(chǔ)操作的一系列操作語句的一個(gè)集合。例如我要將200元從賬戶A轉(zhuǎn)移到賬戶B,那么我可能會(huì)進(jìn)行一下的操作:
a.驗(yàn)證賬戶A中的余額是否大于200元。
b.將賬戶A中的余額減200元。
c.將賬戶B中的余額加200元。
我們就將上面的abc三個(gè)操作成為一個(gè)事務(wù)。
這時(shí),我們會(huì)注意到我們所說的一個(gè)事務(wù)有可能是由多條語句組合而成的,而事務(wù)又存在原子性,即事務(wù)的執(zhí)行過程中是不能被打斷的,這就帶來一個(gè)問題,如果在這三步執(zhí)行過程中有另外的語句插入進(jìn)來執(zhí)行,是否會(huì)對結(jié)果產(chǎn)生影響,因?yàn)榇藭r(shí)破壞了事務(wù)的原子性。而這種插入的情況在并發(fā)的環(huán)境下是十分常見的。因此,我們(或者說是數(shù)據(jù)庫引擎)就需要在一個(gè)事務(wù)的執(zhí)行過程中對它進(jìn)行“保護(hù)”,即保證外界的其他事務(wù)的語句不能隨意的插進(jìn)正在執(zhí)行的事務(wù)語句之中,來保證事務(wù)的正常執(zhí)行。這時(shí)候我們很容易的會(huì)想到“加鎖”這個(gè)方法。這其實(shí)是一種很籠統(tǒng)的說法,因?yàn)榧渔i雖然能夠保證事務(wù)的正常執(zhí)行,但是卻會(huì)帶來較大的額外開銷,因此合適的時(shí)候選擇合適的加鎖方式對查找效率的影響就非常大。而“鎖”得嚴(yán)不嚴(yán),就區(qū)分除了集中不同的隔離級別。

READ UNCOMMITED(讀未提交)

這種隔離界別下,讀取數(shù)據(jù)的時(shí)候不受任何影響。即你甚至可以讀取一個(gè)正在被其他事務(wù)修改的數(shù)據(jù),想讀就讀,想改就改。這當(dāng)然開銷很小,但是會(huì)帶來許多的問題,比如“臟讀”。即讀取到了正在修改但是卻還沒有提交的數(shù)據(jù),這就會(huì)造成數(shù)據(jù)讀取的錯(cuò)誤。從性能上來說,READ UNCOMMITED不會(huì)比其他級別好太多,但是卻帶來了非常多的麻煩的問題,因此在實(shí)際中很少使用這個(gè)個(gè)立即被。

READ COMMITED(提交讀/不可重復(fù)讀)

這個(gè)級別在READ UNCOMMITED的基礎(chǔ)上添加了一些規(guī)定,是一些數(shù)據(jù)庫的默認(rèn)隔離級別。它與READ UNCOMMITED的區(qū)別在于,它規(guī)定讀取的時(shí)候讀到的數(shù)據(jù)只能是提交后的數(shù)據(jù)。舉個(gè)例子,數(shù)據(jù)a在上一次提交之后的值是1,這時(shí)候有一個(gè)線程進(jìn)來對a進(jìn)行修改,將a修改為2,但是此時(shí)并未提交事務(wù)(COMMIT),在這種情況下,READ UNCOMMITED級別下讀取到的a的值就是當(dāng)前的2,但是READ COMMITED級別下讀取到的還是上一次提交之后的值,即a為1,必須到修改線程將a的值變?yōu)?這個(gè)事務(wù)提交之后讀取到的a的值才是2。這個(gè)級別所帶來的問題就是不可重復(fù)讀。即上一個(gè)時(shí)間讀取到的a的值是1,但是隨著修改線程對事務(wù)的提交,a的值變?yōu)榱?,這時(shí)候讀到的值就是2了,即執(zhí)行兩次相同的讀取操作得到的值卻不一樣。
不可重復(fù)讀同臟讀的區(qū)別在于,臟讀是一個(gè)事務(wù)讀取了另一未完成的事務(wù)執(zhí)行過程中的數(shù)據(jù),而不可重復(fù)讀是一個(gè)事務(wù)執(zhí)行過程中,另一事務(wù)提交并修改了當(dāng)前事務(wù)正在讀取的數(shù)據(jù)。

REPEATED READ(可重復(fù)讀)

REPEATED READ在READ COMMITED的基礎(chǔ)上又添加了一些約束性的規(guī)則,它也是MySQL數(shù)據(jù)庫的默認(rèn)隔離級別。簡單來說就是在一個(gè)事務(wù)的執(zhí)行期間禁止其他事務(wù)對相應(yīng)的數(shù)據(jù)進(jìn)行修改,這就徹底使得一個(gè)事務(wù)的執(zhí)行過程中所查詢到的數(shù)據(jù)一定是一致的,即解決了臟讀和不可重復(fù)讀的問題,但是卻帶來了新的問題,即“幻讀”。
“幻讀”指的是在一個(gè)事務(wù)執(zhí)行過程中雖然禁止了對相應(yīng)數(shù)據(jù)的修改,但是其他的事務(wù)依然可以插入數(shù)據(jù),這時(shí)候第一個(gè)事務(wù)就會(huì)發(fā)現(xiàn)會(huì)“莫名其妙”多出來一些數(shù)據(jù),像是出現(xiàn)了幻覺似的?;米x和不可重復(fù)讀都是讀取了另一條已經(jīng)提交的事務(wù)(這點(diǎn)同臟讀不同),所不同的是不可重復(fù)讀查詢的都是同一個(gè)數(shù)據(jù)項(xiàng),而幻讀針對的是一批數(shù)據(jù)整體(比如數(shù)據(jù)的個(gè)數(shù))。

SERIALIZABLE (可串行化)

這是最嚴(yán)格的一個(gè)隔離級別。它通過強(qiáng)制事務(wù)串行執(zhí)行,避免了幻讀的問題。但是這種隔離級別的開銷極大,一般也不常使用。

各種隔離級別與可能的問題關(guān)系如下:

隔離級別 臟讀 不可重復(fù)讀 幻讀 加鎖
READ UNCOMMITED YES YES YES NO
READ COMMITED NO YES YES NO
REPEATED READ NO NO YES NO
SERIALIZABLE NO NO NO YES

二、MVCC

試想一下,如果每次SQL操作為了保證數(shù)據(jù)的一致性與準(zhǔn)確性,都需要加一個(gè)行級鎖的話,非??煽?,但是帶來的系統(tǒng)開銷與查找效率的下降也是非常明顯的,因此MVCC就是為了解決這種矛盾而產(chǎn)生的。
首先MVCC會(huì)在表中的每一行記錄后面保存兩個(gè)隱藏的列,一個(gè)保存行的創(chuàng)建時(shí)間,一個(gè)保存行的過期(刪除)時(shí)間。這個(gè)時(shí)間值并不是真的時(shí)間,而是一個(gè)系統(tǒng)版本號(hào)。事務(wù)開始的時(shí)刻的系統(tǒng)版本號(hào)作為事務(wù)的版本號(hào),用來和查詢到的每行記錄的版本號(hào)進(jìn)行比較。

  • INSERT:為新插入的每一行保存當(dāng)前的系統(tǒng)版本號(hào)作為行版本號(hào)。
  • DELETE:為刪除的每一行保存當(dāng)前的系統(tǒng)版本號(hào)最為行刪除版本號(hào)。
  • UPDATE:更新其實(shí)應(yīng)該理解為插入一條新的數(shù)據(jù),并刪除原來數(shù)據(jù)的過程,即為新插入的數(shù)據(jù)保存當(dāng)前的系統(tǒng)版本號(hào)作為行版本號(hào),并為刪除的數(shù)據(jù)保存當(dāng)前的系統(tǒng)版本號(hào)作為刪除版本號(hào)。
  • SELECT:只查詢滿足下列條件的行:

a.行版本號(hào)小于等于事務(wù)版本號(hào)
b.刪除版本號(hào)未定義或者大于事務(wù)版本號(hào)

保存了這兩個(gè)版本號(hào)之后絕大多數(shù)的操作都可以在不加鎖的情況下進(jìn)行正確的操作,保證了性能和效率。
值得注意的是MVCC只在READ COMMITED和REPEATABLE READ兩個(gè)隔離級別下工作。

以上就是詳解MySQL 數(shù)據(jù)庫隔離級別與MVCC的詳細(xì)內(nèi)容,更多關(guān)于MySQL 數(shù)據(jù)庫隔離級別與MVCC的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • 詳解MySQL事務(wù)的隔離級別與MVCC
  • Mysql MVCC機(jī)制原理詳解
  • mysql的MVCC多版本并發(fā)控制的實(shí)現(xiàn)
  • MySQL中的樂觀鎖,悲觀鎖和MVCC全面解析
  • 淺析MySQL - MVCC
  • mysql多版本并發(fā)控制MVCC的實(shí)現(xiàn)
  • 關(guān)于Mysql隔離級別、鎖與MVCC介紹
  • 詳解MySQL多版本并發(fā)控制機(jī)制(MVCC)源碼

標(biāo)簽:黑河 資陽 隨州 甘南 滄州 吉林 荊州 錦州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解MySQL 數(shù)據(jù)庫隔離級別與MVCC》,本文關(guān)鍵詞  詳解,MySQL,數(shù)據(jù)庫,隔離,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解MySQL 數(shù)據(jù)庫隔離級別與MVCC》相關(guān)的同類信息!
  • 本頁收集關(guān)于詳解MySQL 數(shù)據(jù)庫隔離級別與MVCC的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章