-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
什么是可重復(fù)讀
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于什么是可重復(fù)讀的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、可重復(fù)讀實現(xiàn)
事務(wù)指的就是一系列原子性的操作,這些操作要么全做,要么全都不做。事務(wù)是由引擎層支持的,而MylSAM不支持事務(wù),InnoDB支持事務(wù)。
事務(wù)的隔離性是指事務(wù)之間互不干擾,相互隔離。Mysql有四種隔離級別,分別是未提交讀,提交讀,可重復(fù)讀和串行化。
在Mysql中,事務(wù)更新時,會記錄回滾操作。下圖就是將1改成2,2改成3,3改成4對應(yīng)的回滾記錄。
同一條記錄存在不同版本,這就是MVVC,一個事務(wù)可以通過回滾操作得到該事務(wù)想要的版本
當(dāng)系統(tǒng)中沒有比當(dāng)前回滾更早的read-view時,回滾日志會被刪除,因此最好不要用長事務(wù),因為會導(dǎo)致大量回滾日志無法刪除,占用大量空間。
set autocommit=1是顯示啟動事務(wù)的方式,啟動事務(wù)時用begin /start transaction,提交是commit,回滾用rollback。如果設(shè)置為set autocommit=0,那么執(zhí)行select時會創(chuàng)建事務(wù),而且如果是長連接,事務(wù)沒有提交則不會自動提交,造成長事務(wù)。所以最好使用set autocommit =1。使用commit work and chain可以再下一次事務(wù)自動開啟。
二、mysql 解決可提交讀、可重復(fù)讀、幻讀
這張圖本人覺得總結(jié)得挺好的,在一般的互聯(lián)網(wǎng)項目中,基本上用的都是Innodb引擎,一般只涉及到的都是行級鎖,但是如果sql語句中不帶索引進行操作,可能會導(dǎo)致鎖表,這是不推薦的,性能非常低,可能會導(dǎo)致全表掃描等,行鎖的具體實現(xiàn)算法有以下幾種mysql特有的鎖:
Record Lock(記錄鎖):單個行記錄的鎖,一般是唯一索引或者主鍵上的加鎖
Gap Lock(間隙鎖):鎖定一個區(qū)間,但是不包括自身,開區(qū)間的鎖,RR級別才會有間隙鎖,間隙鎖的唯一目的是防止區(qū)間數(shù)據(jù)的插入,所以間隙鎖與間隙鎖之間是不會相互阻塞的
Next-key Lock(臨鍵鎖):與間隙鎖的區(qū)別是包括自身,是左開右閉區(qū)間,RR級別才會有
加鎖規(guī)則里面,包含了兩個“原則”、兩個“優(yōu)化”和一個“bug”。
原則 1:加鎖的基本單位是 next-key lock,希望你還記得,next-key lock 是前開后閉區(qū)間。
原則 2:查找過程中訪問到的對象才會加鎖。
優(yōu)化 1:索引上的等值查詢,給唯一索引加鎖的時候,next-key lock 退化為行鎖。
優(yōu)化 2:索引上的等值查詢,向右遍歷時且最后一個值不滿足等值條件的時候,next-key lock 退化為間隙鎖。
一個 bug:唯一索引上的范圍查詢會訪問到不滿足條件的第一個值為止。
舉例來說明上述的原則:
建表
插入數(shù)據(jù):
INSERT INTO t ( id , c , d ) VALUES (0, 0, 0);
INSERT INTO t ( id , c , d ) VALUES (5, 5, 10);
INSERT INTO t ( id , c , d ) VALUES (10, 10, 10);
INSERT INTO t ( id , c , d ) VALUES (15, 15, 15);
INSERT INTO t ( id , c , d ) VALUES (20, 20, 20);
INSERT INTO t ( id , c , d ) VALUES (25, 25, 25);
例子1:鎖表
因為d字段上沒有建索引,所以涉及該字段的查詢加鎖會鎖住整個表
因為d字段上面沒有建立索引,所以事務(wù)1執(zhí)行后會導(dǎo)致整個表被鎖,后面所有的操作都會在等待整個表鎖被釋放
例子2:主鍵/唯一索引 記錄鎖
id字段為主鍵,而且事務(wù)1查詢命中了唯一的記錄,默認(rèn)是加Next-key Lock,區(qū)間是(0,5],但是根據(jù)優(yōu)化1,唯一索引/主鍵上的等值查詢,會退化為行鎖,所以只會鎖5這個記錄。
例子3:主鍵/唯一索引上的間隙鎖
由于表 t 中沒有 id=7 的記錄,所以用我們上面提到的加鎖規(guī)則判斷一下的話:根據(jù)原則 1,加鎖單位是 next-key lock,事務(wù)1加鎖范圍就是 (5,10];同時根據(jù)優(yōu)化 2,這是一個等值查詢 (id=7),而 id=10 不滿足查詢條件,next-key lock 退化成間隙鎖,因此最終加鎖的范圍是 (5,10),所以事務(wù)2會阻塞,事務(wù)3執(zhí)行成功。
例子4:普通索引上的間隙鎖
c字段是普通索引,事務(wù)1執(zhí)行時默認(rèn)是對區(qū)間(0,5]加間隙鎖,根據(jù)優(yōu)化2,非唯一索引/主鍵會繼續(xù)向右遍歷,找到10,所以最終的加鎖為(0,5]的Next-Key鎖+(5,10)的間隙鎖,所以事務(wù)2阻塞,事務(wù)3成功。
例子5:間隙鎖與行鎖
事務(wù)1默認(rèn)的Next-Key鎖區(qū)間是(0,5],根據(jù)優(yōu)化2會向右遍歷,找到不滿足查詢條件的10,退化成間隙鎖,所以事務(wù)1的鎖是(0,5]的Next-Key鎖+(5,10)的間隙鎖,這兩個鎖與行鎖是沖突的,而事務(wù)2申請的Next-Key鎖是和事務(wù)1一樣,但是c=5的行鎖與事務(wù)1沖突,所以產(chǎn)生了阻塞,如果改為update t set d=1000 where c=6;因為此時產(chǎn)生的間隙鎖為(5,10),而間隙鎖與間隙鎖是不沖突的,不會產(chǎn)生阻塞
例子6:lock in share mode鎖覆蓋索引
事務(wù)1存在覆蓋索引的情況,不會去回表,lock in share mode這種情況下只會鎖c字段索引,而事務(wù)2是對主鍵加行鎖,所以兩者不存在沖突。
例子7:主鍵/唯一索引上的范圍查詢
開始執(zhí)行的時候,要找到第一個 id=10 的行,因此本該是 Next-Key Lock(5,10],根據(jù)優(yōu)化 1, 主鍵 id 上的等值條件,退化成行鎖,只加了 id=10 這一行的行鎖。范圍查找就往后繼續(xù)找,找到 id=15 這一行停下來,因此需要加 Next-Key Lock(10,15],所以事務(wù)3是沖突的。
例子8:普通索引上的范圍查詢
開始執(zhí)行時,找到第一個滿足條件的行10,加鎖Next-Key Lock(5,10],因為不是唯一索引,所以不會退化,繼續(xù)向后面找,找到15這一行停下來,因此需要加 Next-Key Lock(10,15],因為是范圍查詢,所以鎖不會退化。
快照讀: 通過MVCC實現(xiàn),該技術(shù)不僅可以保證innodb的可重復(fù)讀,而且可以防止幻讀,但是他讀取的數(shù)據(jù)雖然是一致的,但是數(shù)據(jù)是歷史數(shù)據(jù)。
簡單的select操作(不包括 select … lock in share mode, select … for update)
當(dāng)前讀: 要做到保證數(shù)據(jù)是一致的,同時讀取的數(shù)據(jù)是最新的數(shù)據(jù),innodb提供了next-key lock,即gap鎖與行鎖結(jié)合來實現(xiàn)。
select … lock in share mode
select … for update
insert
update
delete
自己理解:
簡單的select是快照讀,快照讀實現(xiàn)可提交讀,可重復(fù)讀和幻讀是通過MVCC+ReadView實現(xiàn)的,而當(dāng)前讀實現(xiàn)這幾種是通過鎖來實現(xiàn)的,為了說明具體原理,下面介紹下MVCC和ReadView概念,所以簡單的select是通過樂觀鎖實現(xiàn)的,當(dāng)前讀是通過悲觀鎖實現(xiàn)的。
參考文章:
https://www.sohu.com/a/302045871_411876
https://www.jianshu.com/p/d1aba64b5c03
https://www.jianshu.com/p/32904ee07e56
三、數(shù)據(jù)庫隔離級別中是否存在不可重復(fù)讀什么意思啊
隔離級別中的重復(fù)讀是是指在第一次讀出數(shù)據(jù)后 數(shù)據(jù)被修改了 但第二次去讀為保證數(shù)據(jù)一致,還是與第一次讀的一樣,這是比較高的隔離級別。還有一個比它高的幻影讀 是即使你添加列等操作都讀不出來
四、什么是不可重復(fù)讀?
不可重復(fù)讀
A用戶讀取數(shù)據(jù),隨后B用戶讀出該數(shù)據(jù)并修改,此時A用戶再讀取數(shù)據(jù)時發(fā)現(xiàn)前后兩次的值不一致
并發(fā)控制的主要方法是封鎖,鎖就是在一段時間內(nèi)禁止用戶做某些操作以避免產(chǎn)生數(shù)據(jù)不一致
以上就是關(guān)于什么是可重復(fù)讀相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
杭州2023年什么時候峰會(杭州2023年什么時候峰會?。?/a>
幼兒園景觀設(shè)計作業(yè)排版(幼兒園景觀設(shè)計作業(yè)排版圖)