-
當(dāng)前位置:首頁(yè) > 創(chuàng)意學(xué)院 > 技術(shù) > 專(zhuān)題列表 > 正文
什么是可重復(fù)讀
大家好!今天讓創(chuàng)意嶺的小編來(lái)大家介紹下關(guān)于什么是可重復(fù)讀的問(wèn)題,以下是小編對(duì)此問(wèn)題的歸納整理,讓我們一起來(lái)看看吧。
開(kāi)始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話(huà)答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫(xiě)出的就越詳細(xì),有微信小程序端、在線(xiàn)網(wǎng)頁(yè)版、PC客戶(hù)端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶(hù)遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請(qǐng)撥打電話(huà)175-8598-2043,或添加微信:1454722008
本文目錄:
一、可重復(fù)讀實(shí)現(xiàn)
事務(wù)指的就是一系列原子性的操作,這些操作要么全做,要么全都不做。事務(wù)是由引擎層支持的,而MylSAM不支持事務(wù),InnoDB支持事務(wù)。
事務(wù)的隔離性是指事務(wù)之間互不干擾,相互隔離。Mysql有四種隔離級(jí)別,分別是未提交讀,提交讀,可重復(fù)讀和串行化。
在Mysql中,事務(wù)更新時(shí),會(huì)記錄回滾操作。下圖就是將1改成2,2改成3,3改成4對(duì)應(yīng)的回滾記錄。
同一條記錄存在不同版本,這就是MVVC,一個(gè)事務(wù)可以通過(guò)回滾操作得到該事務(wù)想要的版本
當(dāng)系統(tǒng)中沒(méi)有比當(dāng)前回滾更早的read-view時(shí),回滾日志會(huì)被刪除,因此最好不要用長(zhǎng)事務(wù),因?yàn)闀?huì)導(dǎo)致大量回滾日志無(wú)法刪除,占用大量空間。
set autocommit=1是顯示啟動(dòng)事務(wù)的方式,啟動(dòng)事務(wù)時(shí)用begin /start transaction,提交是commit,回滾用rollback。如果設(shè)置為set autocommit=0,那么執(zhí)行select時(shí)會(huì)創(chuàng)建事務(wù),而且如果是長(zhǎng)連接,事務(wù)沒(méi)有提交則不會(huì)自動(dòng)提交,造成長(zhǎng)事務(wù)。所以最好使用set autocommit =1。使用commit work and chain可以再下一次事務(wù)自動(dòng)開(kāi)啟。
二、mysql 解決可提交讀、可重復(fù)讀、幻讀
這張圖本人覺(jué)得總結(jié)得挺好的,在一般的互聯(lián)網(wǎng)項(xiàng)目中,基本上用的都是Innodb引擎,一般只涉及到的都是行級(jí)鎖,但是如果sql語(yǔ)句中不帶索引進(jìn)行操作,可能會(huì)導(dǎo)致鎖表,這是不推薦的,性能非常低,可能會(huì)導(dǎo)致全表掃描等,行鎖的具體實(shí)現(xiàn)算法有以下幾種mysql特有的鎖:
Record Lock(記錄鎖):單個(gè)行記錄的鎖,一般是唯一索引或者主鍵上的加鎖
Gap Lock(間隙鎖):鎖定一個(gè)區(qū)間,但是不包括自身,開(kāi)區(qū)間的鎖,RR級(jí)別才會(huì)有間隙鎖,間隙鎖的唯一目的是防止區(qū)間數(shù)據(jù)的插入,所以間隙鎖與間隙鎖之間是不會(huì)相互阻塞的
Next-key Lock(臨鍵鎖):與間隙鎖的區(qū)別是包括自身,是左開(kāi)右閉區(qū)間,RR級(jí)別才會(huì)有
加鎖規(guī)則里面,包含了兩個(gè)“原則”、兩個(gè)“優(yōu)化”和一個(gè)“bug”。
原則 1:加鎖的基本單位是 next-key lock,希望你還記得,next-key lock 是前開(kāi)后閉區(qū)間。
原則 2:查找過(guò)程中訪(fǎng)問(wèn)到的對(duì)象才會(huì)加鎖。
優(yōu)化 1:索引上的等值查詢(xún),給唯一索引加鎖的時(shí)候,next-key lock 退化為行鎖。
優(yōu)化 2:索引上的等值查詢(xún),向右遍歷時(shí)且最后一個(gè)值不滿(mǎn)足等值條件的時(shí)候,next-key lock 退化為間隙鎖。
一個(gè) bug:唯一索引上的范圍查詢(xún)會(huì)訪(fǎng)問(wèn)到不滿(mǎn)足條件的第一個(gè)值為止。
舉例來(lái)說(shuō)明上述的原則:
建表
插入數(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:鎖表
因?yàn)閐字段上沒(méi)有建索引,所以涉及該字段的查詢(xún)加鎖會(huì)鎖住整個(gè)表
因?yàn)閐字段上面沒(méi)有建立索引,所以事務(wù)1執(zhí)行后會(huì)導(dǎo)致整個(gè)表被鎖,后面所有的操作都會(huì)在等待整個(gè)表鎖被釋放
例子2:主鍵/唯一索引 記錄鎖
id字段為主鍵,而且事務(wù)1查詢(xún)命中了唯一的記錄,默認(rèn)是加Next-key Lock,區(qū)間是(0,5],但是根據(jù)優(yōu)化1,唯一索引/主鍵上的等值查詢(xún),會(huì)退化為行鎖,所以只會(huì)鎖5這個(gè)記錄。
例子3:主鍵/唯一索引上的間隙鎖
由于表 t 中沒(méi)有 id=7 的記錄,所以用我們上面提到的加鎖規(guī)則判斷一下的話(huà):根據(jù)原則 1,加鎖單位是 next-key lock,事務(wù)1加鎖范圍就是 (5,10];同時(shí)根據(jù)優(yōu)化 2,這是一個(gè)等值查詢(xún) (id=7),而 id=10 不滿(mǎn)足查詢(xún)條件,next-key lock 退化成間隙鎖,因此最終加鎖的范圍是 (5,10),所以事務(wù)2會(huì)阻塞,事務(wù)3執(zhí)行成功。
例子4:普通索引上的間隙鎖
c字段是普通索引,事務(wù)1執(zhí)行時(shí)默認(rèn)是對(duì)區(qū)間(0,5]加間隙鎖,根據(jù)優(yōu)化2,非唯一索引/主鍵會(huì)繼續(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會(huì)向右遍歷,找到不滿(mǎn)足查詢(xún)條件的10,退化成間隙鎖,所以事務(wù)1的鎖是(0,5]的Next-Key鎖+(5,10)的間隙鎖,這兩個(gè)鎖與行鎖是沖突的,而事務(wù)2申請(qǐng)的Next-Key鎖是和事務(wù)1一樣,但是c=5的行鎖與事務(wù)1沖突,所以產(chǎn)生了阻塞,如果改為update t set d=1000 where c=6;因?yàn)榇藭r(shí)產(chǎn)生的間隙鎖為(5,10),而間隙鎖與間隙鎖是不沖突的,不會(huì)產(chǎn)生阻塞
例子6:lock in share mode鎖覆蓋索引
事務(wù)1存在覆蓋索引的情況,不會(huì)去回表,lock in share mode這種情況下只會(huì)鎖c字段索引,而事務(wù)2是對(duì)主鍵加行鎖,所以?xún)烧卟淮嬖跊_突。
例子7:主鍵/唯一索引上的范圍查詢(xún)
開(kāi)始執(zhí)行的時(shí)候,要找到第一個(gè) id=10 的行,因此本該是 Next-Key Lock(5,10],根據(jù)優(yōu)化 1, 主鍵 id 上的等值條件,退化成行鎖,只加了 id=10 這一行的行鎖。范圍查找就往后繼續(xù)找,找到 id=15 這一行停下來(lái),因此需要加 Next-Key Lock(10,15],所以事務(wù)3是沖突的。
例子8:普通索引上的范圍查詢(xún)
開(kāi)始執(zhí)行時(shí),找到第一個(gè)滿(mǎn)足條件的行10,加鎖Next-Key Lock(5,10],因?yàn)椴皇俏ㄒ凰饕?,所以不?huì)退化,繼續(xù)向后面找,找到15這一行停下來(lái),因此需要加 Next-Key Lock(10,15],因?yàn)槭欠秶樵?xún),所以鎖不會(huì)退化。
快照讀: 通過(guò)MVCC實(shí)現(xiàn),該技術(shù)不僅可以保證innodb的可重復(fù)讀,而且可以防止幻讀,但是他讀取的數(shù)據(jù)雖然是一致的,但是數(shù)據(jù)是歷史數(shù)據(jù)。
簡(jiǎn)單的select操作(不包括 select … lock in share mode, select … for update)
當(dāng)前讀: 要做到保證數(shù)據(jù)是一致的,同時(shí)讀取的數(shù)據(jù)是最新的數(shù)據(jù),innodb提供了next-key lock,即gap鎖與行鎖結(jié)合來(lái)實(shí)現(xiàn)。
select … lock in share mode
select … for update
insert
update
delete
自己理解:
簡(jiǎn)單的select是快照讀,快照讀實(shí)現(xiàn)可提交讀,可重復(fù)讀和幻讀是通過(guò)MVCC+ReadView實(shí)現(xiàn)的,而當(dāng)前讀實(shí)現(xiàn)這幾種是通過(guò)鎖來(lái)實(shí)現(xiàn)的,為了說(shuō)明具體原理,下面介紹下MVCC和ReadView概念,所以簡(jiǎn)單的select是通過(guò)樂(lè)觀鎖實(shí)現(xiàn)的,當(dāng)前讀是通過(guò)悲觀鎖實(shí)現(xiàn)的。
參考文章:
https://www.sohu.com/a/302045871_411876
https://www.jianshu.com/p/d1aba64b5c03
https://www.jianshu.com/p/32904ee07e56
三、數(shù)據(jù)庫(kù)隔離級(jí)別中是否存在不可重復(fù)讀什么意思啊
隔離級(jí)別中的重復(fù)讀是是指在第一次讀出數(shù)據(jù)后 數(shù)據(jù)被修改了 但第二次去讀為保證數(shù)據(jù)一致,還是與第一次讀的一樣,這是比較高的隔離級(jí)別。還有一個(gè)比它高的幻影讀 是即使你添加列等操作都讀不出來(lái)
四、什么是不可重復(fù)讀?
不可重復(fù)讀
A用戶(hù)讀取數(shù)據(jù),隨后B用戶(hù)讀出該數(shù)據(jù)并修改,此時(shí)A用戶(hù)再讀取數(shù)據(jù)時(shí)發(fā)現(xiàn)前后兩次的值不一致
并發(fā)控制的主要方法是封鎖,鎖就是在一段時(shí)間內(nèi)禁止用戶(hù)做某些操作以避免產(chǎn)生數(shù)據(jù)不一致
以上就是關(guān)于什么是可重復(fù)讀相關(guān)問(wèn)題的回答。希望能幫到你,如有更多相關(guān)問(wèn)題,您也可以聯(lián)系我們的客服進(jìn)行咨詢(xún),客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。
推薦閱讀:
杭州2023年什么時(shí)候峰會(huì)(杭州2023年什么時(shí)候峰會(huì)?。?/a>
做銷(xiāo)售找客戶(hù)渠道(開(kāi)發(fā)新客戶(hù)的十大渠道)
幼兒園景觀設(shè)計(jì)作業(yè)排版(幼兒園景觀設(shè)計(jì)作業(yè)排版圖)
猜你喜歡
數(shù)據(jù)分析工作目標(biāo)(數(shù)據(jù)分析工作目標(biāo)怎么寫(xiě))
中國(guó)學(xué)院排名(中國(guó)音樂(lè)學(xué)院排名)
Google注冊(cè)入口(google注冊(cè)賬號(hào)入口)
百度視頻2020舊版本下(百度視頻2020舊版本下百搜視頻舊版本蘋(píng)果手機(jī)怎么下載)
關(guān)鍵詞分類(lèi)和組合方式(關(guān)鍵詞分類(lèi)和組合方式的區(qū)別)
大學(xué)地理專(zhuān)業(yè)學(xué)什么(地理系真的很難就業(yè)嗎)
門(mén)戶(hù)網(wǎng)站建站系統(tǒng)(門(mén)戶(hù)網(wǎng)站建站系統(tǒng)怎么弄)
問(wèn)大家
成為月薪W的平面設(shè)計(jì)師都需要什么學(xué)歷?平面設(shè)計(jì)怎么學(xué)?
濟(jì)南千佛山的相親大會(huì)0年上半年是什么時(shí)候舉行呀?咋報(bào)名
西城開(kāi)工儀式辦公會(huì)議場(chǎng)地出租有什么行業(yè)秘籍?路過(guò)的前輩們幫忙答一下
有誰(shuí)知道濟(jì)南三月三千佛山相親大會(huì)什么時(shí)候開(kāi)始???怎么報(bào)名啊?
宿遷值得相信的公眾號(hào)設(shè)計(jì)制作正常什么費(fèi)用?各位朋友們幫忙答一下
城中值得信任的攝影攝像剪輯應(yīng)該注意什么東西?在座的老師們麻煩回一下
衡水專(zhuān)業(yè)制作優(yōu)秀的站牌候車(chē)牌有沒(méi)有什么推薦的?各位前輩們幫幫我
西城簽約儀式保安有什么要注意的嗎?在座的老鐵們?cè)诰€(xiàn)等