溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL ACID四種隔離級(jí)別是什么

發(fā)布時(shí)間:2021-11-10 13:55:01 來(lái)源:億速云 閱讀:97 作者:iii 欄目:MySQL數(shù)據(jù)庫(kù)

本篇內(nèi)容主要講解“MySQL ACID四種隔離級(jí)別是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“MySQL ACID四種隔離級(jí)別是什么”吧!

下面舉一個(gè)銀行應(yīng)用是解釋事務(wù)必要性的一個(gè)經(jīng)典例子。假如一個(gè)銀行的數(shù)據(jù)庫(kù)有兩張表:支票表(checking)和儲(chǔ)蓄表(savings)。現(xiàn)在要從用戶Jane的支票賬戶轉(zhuǎn)移200美元到她的儲(chǔ)蓄賬戶,那么至少需要三個(gè)步驟:

1、檢查支票賬戶的余額高于或者等于200美元。

2、從支票賬戶余額中減去200美元。

3、在儲(chǔ)蓄帳戶余額中增加200美元。

上述三個(gè)步驟的操作必須打包在一個(gè)事務(wù)中,任何一個(gè)步驟失敗,則必須回滾所有的步驟。

可以用START TRANSACTION語(yǔ)句開始一個(gè)事務(wù),然后要么使用COMMIT提交將修改的數(shù)據(jù)持久保存,要么使用ROLLBACK撤銷所有的修改。事務(wù)SQL的樣本如下:

1. start transaction;

2. select balance from checking where customer_id = 10233276;

3. update checking set balance = balance - 200.00 where customer_id = 10233276;

4. update savings set balance = balance + 200.00 where customer_id = 10233276;

5. commit;

ACID表示原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)。一個(gè)很好的事務(wù)處理系統(tǒng),必須具備這些標(biāo)準(zhǔn)特性:

原子性(atomicity)

  一個(gè)事務(wù)必須被視為一個(gè)不可分割的最小工作單元,整個(gè)事務(wù)中的所有操作要么全部提交成功,要么全部失敗回滾,對(duì)于一個(gè)事務(wù)來(lái)說(shuō),不可能只執(zhí)行其中的一部分操作,這就是事務(wù)的原子性

一致性(consistency)

     數(shù)據(jù)庫(kù)總是從一個(gè)一致性的狀態(tài)轉(zhuǎn)換到另一個(gè)一致性的狀態(tài)。(在前面的例子中,一致性確保了,即使在執(zhí)行第三、四條語(yǔ)句之間時(shí)系統(tǒng)崩潰,支票賬戶中也不會(huì)損失200美元,因?yàn)槭聞?wù)最終沒有提交,所以事務(wù)中所做的修改也不會(huì)保存到數(shù)據(jù)庫(kù)中。)

隔離性(isolation)

     通常來(lái)說(shuō),一個(gè)事務(wù)所做的修改在最終提交以前,對(duì)其他事務(wù)是不可見的。(在前面的例子中,當(dāng)執(zhí)行完第三條語(yǔ)句、第四條語(yǔ)句還未開始時(shí),此時(shí)有另外的一個(gè)賬戶匯總程序開始運(yùn)行,則其看到支票帳戶的余額并沒有被減去200美元。)

持久性(durability)

  一旦事務(wù)提交,則其所做的修改不會(huì)永久保存到數(shù)據(jù)庫(kù)。(此時(shí)即使系統(tǒng)崩潰,修改的數(shù)據(jù)也不會(huì)丟失。持久性是個(gè)有占模糊的概念,因?yàn)閷?shí)際上持久性也分很多不同的級(jí)別。有些持久性策略能夠提供非常強(qiáng)的安全保障,而有些則未必,而且不可能有能做到100%的持久性保證的策略。)

隔離級(jí)別:

READ UNCOMMITTED(未提交讀)

  在READ UNCOMMITTED級(jí)別,事務(wù)中的修改,即使沒有提交,對(duì)其他事務(wù)也都是可見的。事務(wù)可以讀取未提交的數(shù)據(jù),這也被稱為臟讀(Dirty Read)。這個(gè)級(jí)別會(huì)導(dǎo)致很多問(wèn)題,從性能上來(lái)說(shuō),READ UNCOMMITTED不會(huì)比其他的級(jí)別好太多,但卻缺乏其他級(jí)別的很多好處,除非真的有非常必要的理由,在實(shí)際應(yīng)用中一般很少使用。

READ COMMITTED(提交讀)

  大多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)的默認(rèn)隔離級(jí)別都是READ COMMTTED(但MySQL不是)。READ COMMITTED滿足前面提到的隔離性的簡(jiǎn)單定義:一個(gè)事務(wù)開始時(shí),只能"看見"已經(jīng)提交的事務(wù)所做的修改。換句話說(shuō),一個(gè)事務(wù)從開始直到提交之前,所做的任何修改對(duì)其他事務(wù)都是不可見的。這個(gè)級(jí)別有時(shí)候叫做不可重復(fù)讀(nonrepeatble read),因?yàn)閮纱螆?zhí)行同樣的查詢,可能會(huì)得到不一樣的結(jié)果

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

  REPEATABLE READ解決了臟讀的問(wèn)題。該隔離級(jí)別保證了在同一個(gè)事務(wù)中多次讀取同樣記錄結(jié)果是一致的。但是理論上,可重復(fù)讀隔離級(jí)別還是無(wú)法解決另外一個(gè)幻讀(Phantom Read)的問(wèn)題。所謂幻讀,指的是當(dāng)某個(gè)事務(wù)在讀取某個(gè)范圍內(nèi)的記錄時(shí),另一個(gè)事務(wù)又在該范圍內(nèi)插入了新的記錄,當(dāng)之前的事務(wù)再次讀取該范圍的記錄時(shí),會(huì)產(chǎn)生幻行(Phantom Row)。InnoDB和XtraDB存儲(chǔ)引擎通過(guò)多版本并發(fā)控制(MVCC,Multiversion Concurrency Control)解決了幻讀的問(wèn)題。

SERIALIZABLE(可串行化)

  SERIALIZABLE是最高的隔離級(jí)別。它通過(guò)強(qiáng)制事務(wù)串行執(zhí)行,避免了前面說(shuō)的幻讀的問(wèn)題。簡(jiǎn)單來(lái)說(shuō),SERIALIZABLE會(huì)在讀取每一行數(shù)據(jù)都加鎖,所以可能導(dǎo)致大量的超時(shí)和鎖爭(zhēng)用問(wèn)題。實(shí)際應(yīng)用中也很少用到這個(gè)隔離級(jí)別,只有在非常需要確保數(shù)據(jù)的一致性而且可以接受沒有并發(fā)的情況下,才考慮采用該級(jí)別。

打鉤說(shuō)明該隔離級(jí)別還存在這種情況,打X代表該隔離級(jí)別已經(jīng)解決了這種情況:

 MySQL ACID四種隔離級(jí)別是什么

到此,相信大家對(duì)“MySQL ACID四種隔離級(jí)別是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI