mysql如何實(shí)現(xiàn)隔離級(jí)別-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買(mǎi)多久送多久,劃算不套路!

成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的定西網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

mysql如何實(shí)現(xiàn)隔離級(jí)別?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

隔離級(jí)別

事務(wù)指定一個(gè)隔離級(jí)別,該隔離級(jí)別定義一個(gè)事務(wù)必須與由其他事務(wù)進(jìn)行的資源或數(shù)據(jù)更改相隔離的程度。隔離級(jí)別從允許的并發(fā)副作用(例如,臟讀或幻讀)的角度進(jìn)行描述。

控制內(nèi)容:

讀取數(shù)據(jù)時(shí)是否占用鎖以及所請(qǐng)求的鎖類型。

占用讀取鎖的時(shí)間。

引用其他事務(wù)修改的行的讀取操作是否:

在該行上的排他鎖被釋放之前阻塞其他事務(wù)。

檢索在啟動(dòng)語(yǔ)句或事務(wù)時(shí)存在的行的已提交版本。

讀取未提交的數(shù)據(jù)修改。

隔離級(jí)別的實(shí)現(xiàn):

未提交讀(RU:read-uncommitted):

在RU級(jí)別中,事務(wù)讀到的所有數(shù)據(jù)都是最新的數(shù)據(jù),可能是事務(wù)提交后的數(shù)據(jù),也可能是事務(wù)執(zhí)行中的數(shù)據(jù)(可能會(huì)被回滾)。

當(dāng)隔離級(jí)別為RU時(shí):

  • 所有的讀不加鎖,讀到的數(shù)據(jù)都是最新的數(shù)據(jù),性能最好。

  • 所有的寫(xiě)加行級(jí)鎖,寫(xiě)完釋放。

提交讀(RC:read-committed):

使用MVCC技術(shù),在每一行加入隱藏的字段(DB_TRX_ID:修改該行的最后一個(gè)事務(wù)的id,DB_ROLL_PTR:指向當(dāng)前行的undo log日志,DB_ROW_ID:行標(biāo)識(shí),DELETE_BIT:刪除標(biāo)志),它實(shí)現(xiàn)了不加鎖的讀操作。

當(dāng)隔離級(jí)別為RC時(shí):

  • 寫(xiě)操作:加行級(jí)鎖。事務(wù)開(kāi)始后,會(huì)在UNDO日志中寫(xiě)入修改記錄,數(shù)據(jù)行中的隱藏列DATA_POLL_PTR存儲(chǔ)指向該行的UNDO記錄的指針。

  • 讀操作:不加鎖。在讀取時(shí),如果該行被其它事務(wù)鎖定,則順著隱藏列DATA_POLL_PTR指針,找到上一個(gè)有效的歷史記錄(有效的記錄:該記錄對(duì)當(dāng)前事務(wù)可見(jiàn),且DELETE_BIT=0)。

可重復(fù)讀(RR:repeatable-read):

使用MVCC技術(shù)來(lái)實(shí)現(xiàn)不加鎖的讀操作。

當(dāng)隔離級(jí)別為RR時(shí):

  • 寫(xiě)操作:加行級(jí)鎖。事務(wù)開(kāi)始后,會(huì)在UNDO日志中寫(xiě)入修改記錄,數(shù)據(jù)行中的隱藏列DATA_POLL_PTR存儲(chǔ)指向該行的UNDO記錄的指針。

  • 讀操作:不加鎖。在讀取時(shí),如果該行被其它事務(wù)鎖定,則順著隱藏列DATA_POLL_PTR指針,找到上一個(gè)有效的歷史記錄(有效的記錄:該記錄對(duì)當(dāng)前事務(wù)可見(jiàn),且DELETE_BIT=0)。

從上面可以知道:實(shí)際上RC和RR級(jí)別的操作基本相同,而不同之處在于:行記錄對(duì)于當(dāng)前事務(wù)的可見(jiàn)性(可見(jiàn)性:即哪個(gè)版本的行記錄對(duì)這個(gè)事務(wù)是可見(jiàn)的)。RC級(jí)別對(duì)數(shù)據(jù)的可見(jiàn)性是該數(shù)據(jù)的最新記錄,RR基本對(duì)數(shù)據(jù)的可見(jiàn)性是事務(wù)開(kāi)始時(shí),該數(shù)據(jù)的記錄。

(1)行記錄的可見(jiàn)性(read_view)的實(shí)現(xiàn)

在innodb中,創(chuàng)建一個(gè)事務(wù)的時(shí)候,會(huì)將當(dāng)前系統(tǒng)中的活躍事務(wù)列表創(chuàng)建一個(gè)副本(read_view),里面存儲(chǔ)著的都是在當(dāng)前事務(wù)開(kāi)始時(shí),還沒(méi)commit的事務(wù),這些事務(wù)里的值對(duì)當(dāng)前事務(wù)不可見(jiàn)。

read_view中有兩個(gè)關(guān)鍵值 up_limit_id(當(dāng)前未提交事務(wù)的最小版本號(hào)-1,在up_limit_id之前的事務(wù)都已經(jīng)提交,在up_limit_id之后的事務(wù)可能提交,可能還沒(méi)提交) 和 low_limit_id(當(dāng)前系統(tǒng)尚未分配的下一個(gè)事務(wù)id,也就是目前已出現(xiàn)過(guò)的事務(wù)id的大值+1。注意:low_limit_id不是大的活躍事務(wù)的id。)

注意:當(dāng)前事務(wù)和正在commit的事務(wù)是不在read_view中的。

(2)無(wú)論是RC級(jí)別還是RR級(jí)別,其判斷行記錄的可見(jiàn)性的邏輯是一樣的。

當(dāng)該事務(wù)要讀取undo中的行記錄時(shí),會(huì)將行記錄的版本號(hào)(DB_TRX_ID)與read_view進(jìn)行比較:

1、如果DB_TRX_ID小于up_limit_id,表示該行記錄在當(dāng)前事務(wù)開(kāi)始前就已經(jīng)提交了,并且DELETE_BIT=0,則該行記錄對(duì)當(dāng)前事務(wù)是可見(jiàn)的。

2、如果DB_TRX_ID大于low_limit_id,表示該行記錄在所在的事務(wù)在本次事務(wù)創(chuàng)建后才啟動(dòng)的,所以該行記錄的當(dāng)前值不可見(jiàn)。

3、如果up_limit_id< = DB_TRX_ID <= low_limit_id,判斷DB_TRX_ID是否在活躍事務(wù)鏈中,如果在就是不可見(jiàn),如果不在就是可見(jiàn)的。

4、如果上面判斷都是不可見(jiàn)的,則讀取undo中該行記錄的上一條行記錄,繼續(xù)進(jìn)行判斷。

而對(duì)于RC級(jí)別的語(yǔ)句級(jí)快照和RR級(jí)別的事務(wù)級(jí)快照的之間的區(qū)別,其實(shí)是由read_view生成的時(shí)機(jī)來(lái)實(shí)現(xiàn)的。

RC級(jí)別在執(zhí)行語(yǔ)句時(shí),會(huì)先關(guān)閉原來(lái)的read_view,重新生成新的read_view。而RR級(jí)別的read_view則只在事務(wù)開(kāi)始時(shí)創(chuàng)建的。所以RU級(jí)別每次獲取到的都是最新的數(shù)據(jù),而RR級(jí)別獲取到的是事務(wù)開(kāi)始時(shí)的數(shù)據(jù)。

(3)值得注意的是: 在上面的可見(jiàn)性判斷中,雖然邏輯是一樣的,但是實(shí)際意義上是有區(qū)別的:

在第二步中,對(duì)于RC級(jí)別來(lái)說(shuō),low_limit_id是執(zhí)行語(yǔ)句時(shí)已出現(xiàn)的大事務(wù)id+1,可以認(rèn)為在執(zhí)行語(yǔ)句時(shí),是不存在事務(wù)會(huì)比low_limit_id要大,所以大于low_limit_id的事務(wù)都是不可見(jiàn)的。

而對(duì)于RR級(jí)別來(lái)說(shuō),low_limit_id是當(dāng)前事務(wù)開(kāi)始時(shí)已出現(xiàn)的大事務(wù)+1(也可以認(rèn)為是當(dāng)前事務(wù)的id+1,因?yàn)樵趧?chuàng)建當(dāng)前事務(wù)時(shí),當(dāng)前事務(wù)的id大),大于low_limit_id的事務(wù)表示是在該事務(wù)開(kāi)始后創(chuàng)建的,所以對(duì)RR級(jí)別是不可見(jiàn)。

在第三步中,對(duì)于RC級(jí)別來(lái)說(shuō),只要DB_TRX_ID不在活躍鏈表中,則無(wú)論DB_TRX_ID是否大于事務(wù)id,RC都是可見(jiàn)的。

而對(duì)于RR級(jí)別來(lái)說(shuō),因?yàn)閘ow_limit_id就是當(dāng)前事務(wù)id+1,可以認(rèn)為小于low_limit_id的事務(wù)都是在當(dāng)前事務(wù)創(chuàng)建前出現(xiàn)的,所以也只需要簡(jiǎn)單判斷DB_TRX_ID是否在活躍鏈表中。

串行化(serializable):讀寫(xiě)都會(huì)加鎖

關(guān)于mysql如何實(shí)現(xiàn)隔離級(jí)別問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

網(wǎng)頁(yè)題目:mysql如何實(shí)現(xiàn)隔離級(jí)別-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)地址:http://muchs.cn/article14/cshege.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航做網(wǎng)站、微信小程序云服務(wù)器、營(yíng)銷型網(wǎng)站建設(shè)關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)