創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務器提供商,新人活動買多久送多久,劃算不套路!
成都創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領(lǐng)域包括:成都網(wǎng)站制作、網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的定西網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!mysql如何實現(xiàn)隔離級別?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
隔離級別
事務指定一個隔離級別,該隔離級別定義一個事務必須與由其他事務進行的資源或數(shù)據(jù)更改相隔離的程度。隔離級別從允許的并發(fā)副作用(例如,臟讀或幻讀)的角度進行描述。
控制內(nèi)容:
讀取數(shù)據(jù)時是否占用鎖以及所請求的鎖類型。
占用讀取鎖的時間。
引用其他事務修改的行的讀取操作是否:
在該行上的排他鎖被釋放之前阻塞其他事務。
檢索在啟動語句或事務時存在的行的已提交版本。
讀取未提交的數(shù)據(jù)修改。
隔離級別的實現(xiàn):
未提交讀(RU:read-uncommitted):
在RU級別中,事務讀到的所有數(shù)據(jù)都是最新的數(shù)據(jù),可能是事務提交后的數(shù)據(jù),也可能是事務執(zhí)行中的數(shù)據(jù)(可能會被回滾)。
當隔離級別為RU時:
所有的讀不加鎖,讀到的數(shù)據(jù)都是最新的數(shù)據(jù),性能最好。
所有的寫加行級鎖,寫完釋放。
提交讀(RC:read-committed):
使用MVCC技術(shù),在每一行加入隱藏的字段(DB_TRX_ID:修改該行的最后一個事務的id,DB_ROLL_PTR:指向當前行的undo log日志,DB_ROW_ID:行標識,DELETE_BIT:刪除標志),它實現(xiàn)了不加鎖的讀操作。
當隔離級別為RC時:
寫操作:加行級鎖。事務開始后,會在UNDO日志中寫入修改記錄,數(shù)據(jù)行中的隱藏列DATA_POLL_PTR存儲指向該行的UNDO記錄的指針。
讀操作:不加鎖。在讀取時,如果該行被其它事務鎖定,則順著隱藏列DATA_POLL_PTR指針,找到上一個有效的歷史記錄(有效的記錄:該記錄對當前事務可見,且DELETE_BIT=0)。
可重復讀(RR:repeatable-read):
使用MVCC技術(shù)來實現(xiàn)不加鎖的讀操作。
當隔離級別為RR時:
寫操作:加行級鎖。事務開始后,會在UNDO日志中寫入修改記錄,數(shù)據(jù)行中的隱藏列DATA_POLL_PTR存儲指向該行的UNDO記錄的指針。
讀操作:不加鎖。在讀取時,如果該行被其它事務鎖定,則順著隱藏列DATA_POLL_PTR指針,找到上一個有效的歷史記錄(有效的記錄:該記錄對當前事務可見,且DELETE_BIT=0)。
從上面可以知道:實際上RC和RR級別的操作基本相同,而不同之處在于:行記錄對于當前事務的可見性(可見性:即哪個版本的行記錄對這個事務是可見的)。RC級別對數(shù)據(jù)的可見性是該數(shù)據(jù)的最新記錄,RR基本對數(shù)據(jù)的可見性是事務開始時,該數(shù)據(jù)的記錄。
(1)行記錄的可見性(read_view)的實現(xiàn)
在innodb中,創(chuàng)建一個事務的時候,會將當前系統(tǒng)中的活躍事務列表創(chuàng)建一個副本(read_view),里面存儲著的都是在當前事務開始時,還沒commit的事務,這些事務里的值對當前事務不可見。
read_view中有兩個關(guān)鍵值 up_limit_id(當前未提交事務的最小版本號-1,在up_limit_id之前的事務都已經(jīng)提交,在up_limit_id之后的事務可能提交,可能還沒提交) 和 low_limit_id(當前系統(tǒng)尚未分配的下一個事務id,也就是目前已出現(xiàn)過的事務id的大值+1。注意:low_limit_id不是大的活躍事務的id。)
注意:當前事務和正在commit的事務是不在read_view中的。
(2)無論是RC級別還是RR級別,其判斷行記錄的可見性的邏輯是一樣的。
當該事務要讀取undo中的行記錄時,會將行記錄的版本號(DB_TRX_ID)與read_view進行比較:
1、如果DB_TRX_ID小于up_limit_id,表示該行記錄在當前事務開始前就已經(jīng)提交了,并且DELETE_BIT=0,則該行記錄對當前事務是可見的。
2、如果DB_TRX_ID大于low_limit_id,表示該行記錄在所在的事務在本次事務創(chuàng)建后才啟動的,所以該行記錄的當前值不可見。
3、如果up_limit_id< = DB_TRX_ID <= low_limit_id,判斷DB_TRX_ID是否在活躍事務鏈中,如果在就是不可見,如果不在就是可見的。
4、如果上面判斷都是不可見的,則讀取undo中該行記錄的上一條行記錄,繼續(xù)進行判斷。
而對于RC級別的語句級快照和RR級別的事務級快照的之間的區(qū)別,其實是由read_view生成的時機來實現(xiàn)的。
RC級別在執(zhí)行語句時,會先關(guān)閉原來的read_view,重新生成新的read_view。而RR級別的read_view則只在事務開始時創(chuàng)建的。所以RU級別每次獲取到的都是最新的數(shù)據(jù),而RR級別獲取到的是事務開始時的數(shù)據(jù)。
(3)值得注意的是: 在上面的可見性判斷中,雖然邏輯是一樣的,但是實際意義上是有區(qū)別的:
在第二步中,對于RC級別來說,low_limit_id是執(zhí)行語句時已出現(xiàn)的大事務id+1,可以認為在執(zhí)行語句時,是不存在事務會比low_limit_id要大,所以大于low_limit_id的事務都是不可見的。
而對于RR級別來說,low_limit_id是當前事務開始時已出現(xiàn)的大事務+1(也可以認為是當前事務的id+1,因為在創(chuàng)建當前事務時,當前事務的id大),大于low_limit_id的事務表示是在該事務開始后創(chuàng)建的,所以對RR級別是不可見。
在第三步中,對于RC級別來說,只要DB_TRX_ID不在活躍鏈表中,則無論DB_TRX_ID是否大于事務id,RC都是可見的。
而對于RR級別來說,因為low_limit_id就是當前事務id+1,可以認為小于low_limit_id的事務都是在當前事務創(chuàng)建前出現(xiàn)的,所以也只需要簡單判斷DB_TRX_ID是否在活躍鏈表中。
串行化(serializable):讀寫都會加鎖
關(guān)于mysql如何實現(xiàn)隔離級別問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設公司行業(yè)資訊頻道了解更多相關(guān)知識。
網(wǎng)頁題目:mysql如何實現(xiàn)隔離級別-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://jinyejixie.com/article14/cshege.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導航、做網(wǎng)站、微信小程序、云服務器、營銷型網(wǎng)站建設、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容