千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

當(dāng)前位置:首頁(yè)  >  技術(shù)干貨  > MySQL 是如何實(shí)現(xiàn)四大隔離級(jí)別的?

MySQL 是如何實(shí)現(xiàn)四大隔離級(jí)別的?

來(lái)源:千鋒教育
發(fā)布人:xqq
時(shí)間: 2023-10-13 22:46:57 1697208417

一、MySQL 是如何實(shí)現(xiàn)四大隔離級(jí)別的

首先說(shuō)讀未提交,它是性能較好,也可以說(shuō)它是最野蠻的方式,因?yàn)樗鼔焊鶅壕筒患渔i,所以根本談不上什么隔離效果,可以理解為沒(méi)有隔離。

再來(lái)說(shuō)串行化。讀的時(shí)候加共享鎖,也就是其他事務(wù)可以并發(fā)讀,但是不能寫。寫的時(shí)候加排它鎖,其他事務(wù)不能并發(fā)寫也不能并發(fā)讀。

最后說(shuō)讀提交和可重復(fù)讀。這兩種隔離級(jí)別是比較復(fù)雜的,既要允許一定的并發(fā),又想要兼顧的解決問(wèn)題。

為了解決不可重復(fù)讀,或者為了實(shí)現(xiàn)可重復(fù)讀,MySQL 采用了 MVVC (多版本并發(fā)控制) 的方式。

我們?cè)跀?shù)據(jù)庫(kù)表中看到的一行記錄可能實(shí)際上有多個(gè)版本,每個(gè)版本的記錄除了有數(shù)據(jù)本身外,還要有一個(gè)表示版本的字段,記為 row trx_id,而這個(gè)字段就是使其產(chǎn)生的事務(wù)的 id,事務(wù) ID 記為 transaction id,它在事務(wù)開(kāi)始的時(shí)候向事務(wù)系統(tǒng)申請(qǐng),按時(shí)間先后順序遞增。

一行記錄現(xiàn)在有 3 個(gè)版本,每一個(gè)版本都記錄這使其產(chǎn)生的事務(wù) ID,比如事務(wù)A的transaction id 是100,那么版本1的row trx_id 就是 100,同理版本2和版本3。

在上面介紹讀提交和可重復(fù)讀的時(shí)候都提到了一個(gè)詞,叫做快照,學(xué)名叫做一致性視圖,這也是可重復(fù)讀和不可重復(fù)讀的關(guān)鍵,可重復(fù)讀是在事務(wù)開(kāi)始的時(shí)候生成一個(gè)當(dāng)前事務(wù)全局性的快照,而讀提交則是每次執(zhí)行語(yǔ)句的時(shí)候都重新生成一次快照。

對(duì)于一個(gè)快照來(lái)說(shuō),它能夠讀到那些版本數(shù)據(jù),要遵循以下規(guī)則:

當(dāng)前事務(wù)內(nèi)的更新,可以讀到;

版本未提交,不能讀到;

版本已提交,但是卻在快照創(chuàng)建后提交的,不能讀到;

版本已提交,且是在快照創(chuàng)建前提交的,可以讀到;

利用上面的規(guī)則,再返回去套用到讀提交和可重復(fù)讀的那兩張圖上就很清晰了。還是要強(qiáng)調(diào),兩者主要的區(qū)別就是在快照的創(chuàng)建上,可重復(fù)讀僅在事務(wù)開(kāi)始是創(chuàng)建一次,而讀提交每次執(zhí)行語(yǔ)句的時(shí)候都要重新創(chuàng)建一次。

存在這的情況,兩個(gè)事務(wù),對(duì)同一條數(shù)據(jù)做修改。最后結(jié)果應(yīng)該是哪個(gè)事務(wù)的結(jié)果呢,肯定要是時(shí)間靠后的那個(gè)對(duì)不對(duì)。并且更新之前要先讀數(shù)據(jù),這里所說(shuō)的讀和上面說(shuō)到的讀不一樣,更新之前的讀叫做“當(dāng)前讀”,總是當(dāng)前版本的數(shù)據(jù),也就是多版本中最新一次提交的那版。

假設(shè)事務(wù)A執(zhí)行 update 操作, update 的時(shí)候要對(duì)所修改的行加行鎖,這個(gè)行鎖會(huì)在提交之后才釋放。而在事務(wù)A提交之前,事務(wù)B也想 update 這行數(shù)據(jù),于是申請(qǐng)行鎖,但是由于已經(jīng)被事務(wù)A占有,事務(wù)B是申請(qǐng)不到的,此時(shí),事務(wù)B就會(huì)一直處于等待狀態(tài),直到事務(wù)A提交,事務(wù)B才能繼續(xù)執(zhí)行,如果事務(wù)A的時(shí)間太長(zhǎng),那么事務(wù)B很有可能出現(xiàn)超時(shí)異常。加鎖的過(guò)程要分有索引和無(wú)索引兩種情況,比如下面這條語(yǔ)句

update user set age=11 where id = 1

id 是這張表的主鍵,是有索引的情況,那么 MySQL 直接就在索引數(shù)中找到了這行數(shù)據(jù),然后干凈利落的加上行鎖就可以了。

而下面這條語(yǔ)句

update user set age=11 where age=10

表中并沒(méi)有為 age 字段設(shè)置索引,所以, MySQL 無(wú)法直接定位到這行數(shù)據(jù)。那怎么辦呢,當(dāng)然也不是加表鎖了。MySQL 會(huì)為這張表中所有行加行鎖,沒(méi)錯(cuò),是所有行。但是呢,在加上行鎖后,MySQL 會(huì)進(jìn)行一遍過(guò)濾,發(fā)現(xiàn)不滿足的行就釋放鎖,最終只留下符合條件的行。雖然最終只為符合條件的行加了鎖,但是這一鎖一釋放的過(guò)程對(duì)性能也是影響極大的。所以,如果是大表的話,建議合理設(shè)計(jì)索引,如果真的出現(xiàn)這種情況,那很難保證并發(fā)度。

延伸閱讀:

二、什么是數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)管理系統(tǒng)

數(shù)據(jù)庫(kù)的應(yīng)用非常廣泛,舉個(gè)例子,我們平時(shí)在瀏覽器上搜索內(nèi)容,就要用到數(shù)據(jù)庫(kù)去檢索我們的關(guān)鍵字。以前我們可能會(huì)用數(shù)組、集合、文件等來(lái)存儲(chǔ)數(shù)據(jù),但是接下來(lái)我們就會(huì)面臨一個(gè)問(wèn)題,當(dāng)存儲(chǔ)的數(shù)據(jù)或內(nèi)容過(guò)多的時(shí)候,我們?nèi)绾稳ゾ珳?zhǔn)的找到我們需要的東西,這時(shí)候數(shù)據(jù)庫(kù)管理系統(tǒng)就派上了用場(chǎng)。除此之外,數(shù)據(jù)庫(kù)管理系統(tǒng)還能永久的儲(chǔ)存我們的數(shù)據(jù)。

為了便于大家理解,這里先給大家講解幾個(gè)概念

DB數(shù)據(jù)庫(kù)(database):存儲(chǔ)數(shù)據(jù)的“倉(cāng)庫(kù)”。它保存了一系列有組織的數(shù)據(jù)。

DBMS數(shù)據(jù)庫(kù)管理系統(tǒng)(Database Management System):數(shù)據(jù)庫(kù)是通過(guò)DBMS創(chuàng)建和操作的容器。

SQL,結(jié)構(gòu)化查詢語(yǔ)言(Structured Query Language)用一句話概括,SQL是一種特殊目的的編程語(yǔ)言,一種專門用來(lái)與數(shù)據(jù)庫(kù)通信的語(yǔ)言。在數(shù)據(jù)庫(kù)中,數(shù)據(jù)被結(jié)構(gòu)化并存儲(chǔ)在不同的表中,從而簡(jiǎn)化了訪問(wèn),更新和操作數(shù)據(jù)的過(guò)程。該表由列和行組成。數(shù)據(jù)庫(kù)中的表可以在關(guān)系的幫助下進(jìn)行連接。要在數(shù)據(jù)庫(kù)中執(zhí)行與數(shù)據(jù)相關(guān)的任務(wù),可以使用SQL。SQL代表結(jié)構(gòu)化查詢語(yǔ)言,旨在在特定RDBMS內(nèi)創(chuàng)建,修改和管理數(shù)據(jù)庫(kù)中的數(shù)據(jù)。

SQL優(yōu)點(diǎn):

1、不是某個(gè)特定數(shù)據(jù)庫(kù)供應(yīng)商專有的語(yǔ)言,幾乎所有DBMS(數(shù)據(jù)庫(kù)管理系統(tǒng))都支持SQL

2、簡(jiǎn)單易學(xué)

3、雖然簡(jiǎn)單,但實(shí)際上是一種強(qiáng)有力的語(yǔ)言,靈活使用其語(yǔ)言元素,可以進(jìn)行非常復(fù)雜和高級(jí)的數(shù)據(jù)庫(kù)操作。

聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
免費(fèi)領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
PHP數(shù)組具的特性有哪些?

一、有序集合PHP數(shù)組是一個(gè)有序的數(shù)據(jù)集合,它可以存儲(chǔ)多個(gè)值,并使用索引來(lái)訪問(wèn)這些值。索引可以是數(shù)字或字符串,允許你以靈活的方式組織和訪...詳情>>

2023-10-13 23:46:55
C語(yǔ)言中定義與聲明的含義是什么?

一、定義的含義在C語(yǔ)言中,定義是指為變量、函數(shù)或類型分配存儲(chǔ)空間并指定其屬性和初始值的過(guò)程。定義的主要含義如下:分配存儲(chǔ)空間:定義一個(gè)...詳情>>

2023-10-13 23:32:41
APP開(kāi)發(fā)中常用的開(kāi)發(fā)語(yǔ)言都有什么?

一、JavaJava是一種廣泛使用的開(kāi)發(fā)語(yǔ)言,尤其在Android應(yīng)用開(kāi)發(fā)中得到了廣泛應(yīng)用。Java具有面向?qū)ο蟮奶匦?,可以?shí)現(xiàn)復(fù)雜的應(yīng)用邏輯和交互效果...詳情>>

2023-10-13 23:29:28
Python的自動(dòng)化測(cè)試框架有哪些?

一、unittestunittest是Python內(nèi)置的測(cè)試框架,它受到Java的JUnit框架的啟發(fā)。unittest提供了一個(gè)面向?qū)ο蟮木幊棠P?,允許開(kāi)發(fā)人員編寫測(cè)試用...詳情>>

2023-10-13 23:06:20
Web前端開(kāi)發(fā)工具有哪些?

一、代碼編輯器代碼編輯器是Web前端開(kāi)發(fā)的基礎(chǔ)工具之一,用于編寫、編輯和修改計(jì)算機(jī)代碼。它通常支持多種編程語(yǔ)言,并提供了一些便捷的功能,...詳情>>

2023-10-13 22:58:11