欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

聊聊MySQL事務(wù)的特性和隔離級(jí)別

 更新時(shí)間:2020年09月07日 10:53:53   作者:張小云的博客  
這篇文章主要介紹了MySQL事務(wù)的特性和隔離級(jí)別的相關(guān)資料,幫助大家粗略的認(rèn)識(shí)下MySQL 事務(wù)的相關(guān)知識(shí),感興趣的朋友可以了解下

網(wǎng)上對(duì)于此類的文章已經(jīng)十分飽和了,那還寫的原因很簡(jiǎn)單——作為自己的理解筆記。

前言

  此篇文章作為自己學(xué)習(xí)MySQL的一些個(gè)人理解,使用的引擎是InnoDb。首先先講講事務(wù)的概念,在《高性能MySQL》第三版中其對(duì)事務(wù)的描述是這樣的:

事務(wù)就是一組原子性的SQL查詢,或者說(shuō)一個(gè)獨(dú)立的工作單元。如果數(shù)據(jù)庫(kù)引擎能夠成功地對(duì)數(shù)據(jù)庫(kù)應(yīng)用該組查詢的全部語(yǔ)句,那么就執(zhí)行該組查詢。如果其中有任何一條語(yǔ)句因?yàn)楸罎⒒蚱渌驘o(wú)法執(zhí)行,那么所有的語(yǔ)句都不會(huì)執(zhí)行。

​​  換句話說(shuō),事務(wù)就是一個(gè)整體單位,里面的SQL語(yǔ)句不會(huì)單獨(dú)執(zhí)行,就像某些商品一般,由多個(gè)組件組成,但是我絕對(duì)不單獨(dú)賣組件,要買就買整個(gè)商品,不然就不賣。

​​  簡(jiǎn)單的理解了事務(wù)之后,還需要知道事務(wù)的目的就是為了保證數(shù)據(jù)的正確性和一致性,那么為此則誕生出其4個(gè)特性(后面再細(xì)講),而為了實(shí)現(xiàn)這四個(gè)特性又需要許多具體的實(shí)現(xiàn),其中就包括為了隔離性而產(chǎn)生的四個(gè)隔離級(jí)別,這四種隔離級(jí)別又產(chǎn)生了三個(gè)問題(臟讀、不可重復(fù)讀和幻讀),這就是其大致的關(guān)系,接下來(lái)讓我們來(lái)看看這些具體到底是個(gè)什么東西。

1 四種特性(ACID)

​​  說(shuō)起事務(wù)的特性,那肯定張口就來(lái)ACID,然而除了ACID四個(gè)字母之外我們還是需要說(shuō)點(diǎn)其他東西的。

​​  原子性(Atomicity):意思是說(shuō)一個(gè)事務(wù)應(yīng)當(dāng)作為一個(gè)不可分割的最小單位,整個(gè)事務(wù)的操作要么全部執(zhí)行成功要么全部不執(zhí)行,像原子一樣不可分割(別跟我提夸克),這里的執(zhí)行是指執(zhí)行成功,如果有一個(gè)操作執(zhí)行失敗了那么就全部不執(zhí)行,這也是我們平時(shí)見到的回滾。

​​  一致性(Consistency):書上給出的意思是事務(wù)總是從一個(gè)一致性的狀態(tài)跳到另一個(gè)一致性的狀態(tài)。我的理解是在涉及到的數(shù)據(jù)范圍內(nèi)是守恒的,也就是說(shuō),整體的數(shù)據(jù)是不變的,拿萬(wàn)能的轉(zhuǎn)錢例子來(lái)說(shuō),A賬戶轉(zhuǎn)給B``200元,那么由A和B組成的這個(gè)數(shù)據(jù)范圍來(lái)說(shuō)數(shù)據(jù)并沒有發(fā)生改變(-200+200=0),只是數(shù)據(jù)的組成方式變化了,所以是從一個(gè)一致性狀態(tài)—>另一個(gè)一致性狀態(tài)。

​​  隔離性(Isolation):通常來(lái)說(shuō),一個(gè)事務(wù)的操作對(duì)于其他的事務(wù)的不可見的,也就是說(shuō)一般而言事務(wù)都是獨(dú)立的。但是這跟數(shù)據(jù)庫(kù)的隔離級(jí)別有關(guān),除了某個(gè)(沒錯(cuò),就是你——讀未提交同學(xué))隔離級(jí)別之外,其他的都是不可見的,而這種事務(wù)可見的級(jí)別很少用到,所以說(shuō)的是'通常來(lái)說(shuō)'。

​​  持久性(Durability):事務(wù)一旦完成,那么該事務(wù)引起的數(shù)據(jù)變化將永久生效,不會(huì)改變(除非被另外一個(gè)事務(wù)改動(dòng))。不過書上提到這其實(shí)跟實(shí)行的策略相關(guān),但這貌似就有點(diǎn)走遠(yuǎn)了(是的,我不懂?。?。

​​  以上就是事務(wù)的四種特性,其中隔離性的實(shí)現(xiàn)則是要看數(shù)據(jù)庫(kù)的隔離級(jí)別。

2 數(shù)據(jù)庫(kù)的隔離級(jí)別

  在MySQL中隔離級(jí)別有四種,每種隔離級(jí)別對(duì)應(yīng)的事務(wù)體現(xiàn)不同,可能出現(xiàn)的問題也各自不同。

​​  未提交讀(read uncommited):在這個(gè)隔離級(jí)別中,在一個(gè)事務(wù)執(zhí)行的操作就算不提交也能被其他的事務(wù)看到。在這個(gè)級(jí)別中一個(gè)事務(wù)可能讀到其他事務(wù)還沒提交的臟數(shù)據(jù),即可能出現(xiàn)臟讀。如下圖所示,序號(hào)表示執(zhí)行的順序。

​​  可以看到,在界面1的事務(wù)中往test表插入了一條數(shù)據(jù),此時(shí)就算還沒提交在頁(yè)面2的另一個(gè)事務(wù)中也可以看到提交的數(shù)據(jù)。

​​  提交讀(read commited):在一個(gè)事務(wù)提交之后,其他事務(wù)才可以看到事務(wù)的修改。此隔離級(jí)別可能會(huì)出現(xiàn)同一個(gè)事務(wù)中執(zhí)行相同的查詢卻讀到不同的數(shù)據(jù),即不可重復(fù)讀(nonrepeatable read),另未提交讀也可能出現(xiàn)不可重復(fù)讀。例子如下

​​  可重復(fù)讀(repeatable read):這是MySQL的默認(rèn)隔離級(jí)別,在事務(wù)開始的時(shí)候會(huì)保存此刻的一個(gè)快照(這里啰嗦一下,實(shí)際上是開啟事務(wù)后執(zhí)行第一條語(yǔ)句的時(shí)候準(zhǔn)備的快照,準(zhǔn)備快照的方法則是記錄當(dāng)前事務(wù)的版本號(hào),沒有進(jìn)行數(shù)據(jù)的復(fù)制,不明白事務(wù)版本號(hào)或隱藏字段的可以看看MySQL的MVCC),然后接下來(lái)這個(gè)事務(wù)的所有數(shù)據(jù)讀取都是從這個(gè)快照讀,所以不會(huì)出現(xiàn)不可重復(fù)讀的情況,但是還是有可能出現(xiàn)幻讀。意思就是讀取的是快照表數(shù)據(jù)不會(huì)變化,但是進(jìn)行寫操作如更新的時(shí)候更新的數(shù)量可能會(huì)跟預(yù)期的不同。如圖

​​  可以看到,在界面1插入一條記錄并且提交之后,界面2還是沒有讀到這個(gè)提交的數(shù)據(jù),因?yàn)樗菑氖聞?wù)開始時(shí)的快照表讀取的所以自然是讀不到的,但是在進(jìn)行更新操作的時(shí)候則是更新了意料之外的記錄,這就是一種幻讀的現(xiàn)象。

​​  可串行化(serializable):意思就是事務(wù)要一個(gè)一個(gè)來(lái),如果在一個(gè)事務(wù)中進(jìn)行讀操作,那么其他事務(wù)在該事務(wù)完成前只能進(jìn)行讀操作;如果進(jìn)行寫操作,那么其他事務(wù)的操作都進(jìn)入等待(直到當(dāng)前事務(wù)提交)。這種級(jí)別就可以防范目前出現(xiàn)的臟讀、不可重復(fù)讀、幻讀等現(xiàn)象。如圖

上圖演示的是事務(wù)讀時(shí),其他事務(wù)不可寫,下圖是寫時(shí)不可操作。

3 三個(gè)問題—臟讀、不可重復(fù)讀、幻讀。

​​  這是采取事務(wù)的不同隔離級(jí)別可能產(chǎn)生的幾個(gè)問題,在上面隔離級(jí)別已經(jīng)提及到了,但是為了避免混淆還是單獨(dú)拿出來(lái)。

  • 臟讀:指在一個(gè)事務(wù)中讀到了其他事務(wù)還沒提交的臟數(shù)據(jù),發(fā)生在讀未提交級(jí)別。
  • 不可重復(fù)讀:在一個(gè)事務(wù)中同樣的查詢可能出現(xiàn)不同的結(jié)果,發(fā)生在讀未提交、讀提交級(jí)別。(個(gè)人覺得沒必要特意去理解為叫什么叫不可重復(fù),容易混淆)
  • 幻讀:在一個(gè)事務(wù)中進(jìn)行寫操作的時(shí)候修改的數(shù)量跟預(yù)期的數(shù)量不同,例如修改到了之前查詢不出來(lái)的數(shù)據(jù)。

​​  再啰嗦一些不可重復(fù)讀和幻讀的區(qū)別:可以理解為不可重復(fù)讀是那條記錄的字段值改變了,例如id為1的記錄中name的兩次值都不同;而幻讀則是數(shù)量上的不同,例如我查詢的時(shí)候共有2條記錄,但是執(zhí)行修改操作的時(shí)候卻更新了3條。

以上就是聊聊MySQL事務(wù)的特性和隔離級(jí)別的詳細(xì)內(nèi)容,更多關(guān)于MySQL 事務(wù)特性和隔離級(jí)別的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • mybatis-plus如何使用sql的date_format()函數(shù)查詢數(shù)據(jù)

    mybatis-plus如何使用sql的date_format()函數(shù)查詢數(shù)據(jù)

    這篇文章主要給大家介紹了關(guān)于mybatis-plus如何使用sql的date_format()函數(shù)查詢數(shù)據(jù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-02-02
  • mysql遠(yuǎn)程跨庫(kù)聯(lián)合查詢的示例

    mysql遠(yuǎn)程跨庫(kù)聯(lián)合查詢的示例

    本文主要介紹了mysql遠(yuǎn)程跨庫(kù)聯(lián)合查詢的示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • mysql 5.7.20常用下載、安裝和配置方法及簡(jiǎn)單操作技巧(解壓版免安裝)

    mysql 5.7.20常用下載、安裝和配置方法及簡(jiǎn)單操作技巧(解壓版免安裝)

    這篇文章主要介紹了mysql 5.7.20常用下載、安裝和配置方法及簡(jiǎn)單操作技巧(解壓版免安裝)的相關(guān)資料,需要的朋友可以參考下
    2017-11-11
  • MySQL 使用索引掃描進(jìn)行排序

    MySQL 使用索引掃描進(jìn)行排序

    mysql可以使用同一個(gè)索引既滿足排序,又用于查找行,因此,如果可能,設(shè)計(jì)索引時(shí)應(yīng)該盡可能地同時(shí)滿足這兩種任務(wù),這樣是最好的。本文將介紹如何利用索引來(lái)進(jìn)行排序
    2021-06-06
  • MySQL全文索引實(shí)現(xiàn)簡(jiǎn)單版搜索引擎實(shí)例代碼

    MySQL全文索引實(shí)現(xiàn)簡(jiǎn)單版搜索引擎實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于MySQL全文索引實(shí)現(xiàn)簡(jiǎn)單版搜索引擎的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 解決MySQL批量新增或修改時(shí)出現(xiàn)異常:Lock?wait?timeout?exceeded

    解決MySQL批量新增或修改時(shí)出現(xiàn)異常:Lock?wait?timeout?exceeded

    這篇文章主要給大家介紹了關(guān)于如何解決MySQL批量新增或修改時(shí)出現(xiàn)異常:Lock?wait?timeout?exceeded;try?restarting?transaction的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • 詳解SUM函數(shù)在MySQL中的值處理原則

    詳解SUM函數(shù)在MySQL中的值處理原則

    在SQL中,SUM函數(shù)是用于計(jì)算指定字段的總和的聚合函數(shù),這篇文章將給大家詳細(xì)介紹了SUM函數(shù)在SQL中的值處理原則,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-12-12
  • MySQL如何為字段添加默認(rèn)時(shí)間淺析

    MySQL如何為字段添加默認(rèn)時(shí)間淺析

    這篇文章主要給大家介紹了關(guān)于MySQL如何為字段添加默認(rèn)時(shí)間的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • mysql 數(shù)據(jù)庫(kù)鏈接狀態(tài)確認(rèn)實(shí)驗(yàn)(推薦)

    mysql 數(shù)據(jù)庫(kù)鏈接狀態(tài)確認(rèn)實(shí)驗(yàn)(推薦)

    這篇文章主要介紹了mysql 數(shù)據(jù)庫(kù)鏈接狀態(tài)確認(rèn)實(shí)驗(yàn),通過本文我選擇 了三種方案給大家詳細(xì)講解,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Mysql實(shí)現(xiàn)主從配置和多主多從配置

    Mysql實(shí)現(xiàn)主從配置和多主多從配置

    大型網(wǎng)站為了軟解大量的并發(fā)訪問,除了在網(wǎng)站實(shí)現(xiàn)分布式負(fù)載均衡,遠(yuǎn)遠(yuǎn)不夠。必然會(huì)想到假設(shè)服務(wù)器群,來(lái)分擔(dān)主數(shù)據(jù)庫(kù)的壓力。今天總結(jié)一下利用MySQL主從配置,減輕數(shù)據(jù)庫(kù)壓力
    2021-06-06

最新評(píng)論