成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

MySQL如何解決幻讀問(wèn)題

瀏覽:180日期:2023-10-17 19:37:00
目錄前言一、什么是幻讀?二、幻讀有什么問(wèn)題?(1)需要單獨(dú)解決(2)間隙鎖引發(fā)的并發(fā)度三、如何解決幻讀?三、總結(jié)前言

我們知道MySQL在可重復(fù)讀隔離級(jí)別下別的事物提交的內(nèi)容,是看不到的。而可提交隔離級(jí)別下是可以看到別的事務(wù)提交的。而如果我們的業(yè)務(wù)場(chǎng)景是在事物內(nèi)同樣的兩個(gè)查詢(xún)我們需要看到的數(shù)據(jù)都是一致的,不能被別的事物影響,就使用可重復(fù)讀隔離級(jí)別。這種情況下RR級(jí)別下的普通查詢(xún)(快照讀)依靠MVCC解決“幻讀”問(wèn)題,如果是“當(dāng)前讀”的情況需要依靠什么解決“幻讀”問(wèn)題呢?這就是本博文需要探討的。

在探討前可以看下之前的博文(MySQL是如何實(shí)現(xiàn)事務(wù)隔離?),主要介紹隔離級(jí)別的具體技術(shù)細(xì)節(jié),讀過(guò)以后看此篇文章可能更有幫助。

注:本博文討論的“幻讀”都是指在“可重復(fù)讀”隔離級(jí)別下進(jìn)行。

一、什么是幻讀?

假設(shè)我們有表t結(jié)構(gòu)如下,里面的初始數(shù)據(jù)行為:(0,0,0),(1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5)

CREATE TABLE `t`( `id` INT(11) NOT NULL, `key` INT(11) DEFAULT NULL, `value` INT(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `value` (`value`)) ENGINE = InnoDB;INSERT INTO tVALUES (0, 0, 0), (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5)

假設(shè)select * from where value=1 for update,只在這一行加鎖(注意這只是假設(shè)),其它行不加鎖,那么就會(huì)出現(xiàn)如下場(chǎng)景:

MySQL如何解決幻讀問(wèn)題

Session A的三次查詢(xún)Q1-Q3都是select * from where value=1 for update,查詢(xún)的value=1的所有row。

T1:Q1只返回一行(1,1,1); T2:session B更新id=0的value為1,此時(shí)表t中value=1的數(shù)據(jù)有兩行 T3:Q3返回兩行(0,0,1),(1,1,1) T4:session C插入一行(6,6,1),此時(shí)表t中value=1的數(shù)據(jù)有三行 T5:Q3返回三行(0,0,1),(1,1,1),(6,6,1) T6:session A事物commit。

其中Q3讀到value=1這一樣的現(xiàn)象,就稱(chēng)之為幻讀,幻讀指的是一個(gè)事務(wù)在前后兩次查詢(xún)同一個(gè)范圍的時(shí)候,后一次查詢(xún)看到了前一次查詢(xún)沒(méi)有看到的行。

先對(duì)“幻讀”做出如下解釋?zhuān)?/p> 在可重復(fù)讀隔離級(jí)別下,普通的查詢(xún)是快照讀,是不會(huì)看到別的事務(wù)插入的數(shù)據(jù)的。因此, 幻讀在“當(dāng)前讀”下才會(huì)出現(xiàn)(三個(gè)查詢(xún)都是for update表示當(dāng)前讀); 上面session B的修改update結(jié)果,被session A之后的select語(yǔ)句用“當(dāng)前讀”看到,不能稱(chēng)為幻讀,幻讀僅專(zhuān)指“新插入的行”。二、幻讀有什么問(wèn)題?(1)需要單獨(dú)解決

眾所周知,select ...for update語(yǔ)句就是將相應(yīng)的數(shù)據(jù)行鎖住,比如session A在T1時(shí)刻的Q1查詢(xún)語(yǔ)句:select * from where value=1 for update就是將value=1的數(shù)據(jù)行鎖住,但顯然如果是上述的場(chǎng)景發(fā)生,此時(shí)的for update語(yǔ)義被破壞了(并沒(méi)有鎖住value=1的數(shù)據(jù)行)。

即使把所有的記錄都加上鎖,還是阻止不了新插入的記錄,所以“幻讀”問(wèn)題要單獨(dú)拿出來(lái)解決。沒(méi)法依靠MVCC或者行鎖機(jī)制來(lái)解決。這就引出“間隙鎖”,是另外一種加鎖機(jī)制。

(2)間隙鎖引發(fā)的并發(fā)度

間隙鎖引入以后,可能會(huì)導(dǎo)致同樣語(yǔ)句鎖住更大的范圍,這可能就會(huì)影響了并發(fā)度。具體請(qǐng)看下面介紹

三、如何解決幻讀?

產(chǎn)生幻讀的原因是,行鎖只能鎖住行,但是新插入記錄這個(gè)動(dòng)作,要更新的是記錄之間的“間隙”。因此,為了解決幻讀問(wèn)題,InnoDB只好引入新的鎖,也就是間隙鎖(Gap Lock)。

間隙:比如表中加入6個(gè)記錄,0,5,10,15,20,25。則產(chǎn)生7個(gè)間隙:

MySQL如何解決幻讀問(wèn)題

在一行行掃描的過(guò)程中,不僅將給行加上了行鎖,還給行兩邊的空隙也加上了間隙鎖。這樣就確保了無(wú)法再插入新的記錄。

間隙鎖和行鎖合稱(chēng)next-key lock,每個(gè)next-key lock是前開(kāi)后閉區(qū)間(間隙鎖開(kāi)區(qū)間,next-key lock前開(kāi)后閉區(qū)間):

間隙鎖與間隙鎖之間是不存在沖突的,沖突的是往間隙里插入一條記錄?!?/p>

MySQL如何解決幻讀問(wèn)題

表t中是沒(méi)有value=7這個(gè)數(shù)據(jù)的,所以Q1加的間隙鎖(1,5),而Q2也是加的這個(gè)間隙鎖,兩者不沖突都是為了保護(hù)這個(gè)間隙不允許插入值。

在表t初始化后,假設(shè)表的數(shù)據(jù)如下:

MySQL如何解決幻讀問(wèn)題

如果用select * from for update執(zhí)行,則會(huì)把整個(gè)表所有記錄鎖起來(lái),就形成了7個(gè)next-key lock,分別是(-∞,0]、(0,2]、(2,4]、(4,6]、(6,8]、(8, 10]、(10, +supremum]

間隙鎖的引入,可能會(huì)導(dǎo)致同樣的語(yǔ)句鎖住更大的范圍,是會(huì)影響了并發(fā)度

假設(shè)發(fā)生如下場(chǎng)景:

MySQL如何解決幻讀問(wèn)題

 則明顯發(fā)生了死鎖,分析如下:

Q1:執(zhí)行select …for update語(yǔ)句,由于id=9這一行并不存在,因此會(huì)加上間隙鎖 (8,10); Q2:執(zhí)行select …for update語(yǔ)句,同樣會(huì)加上間隙鎖(8,10),間隙鎖之間不會(huì)沖突,因 此這個(gè)語(yǔ)句可以執(zhí)行成功; session B 試圖插入一行(9,9,9),被session A的間隙鎖擋住了,只好進(jìn)入等待; session A試圖插入一行(9,9,9),被session B的間隙鎖擋住了。

有上述可知間隙鎖的引入,可能會(huì)導(dǎo)致同樣語(yǔ)句鎖住更大的范圍,這其實(shí)是影響了并發(fā)度。

為了解決幻讀問(wèn)題可以采用讀可提交隔離級(jí)別,間隙鎖是在可重復(fù)讀隔離級(jí)別下才會(huì)生效的。所以如果把隔離級(jí)別設(shè)置為讀提交的話(huà), 就沒(méi)有間隙鎖了。但同時(shí),你要解決可能出現(xiàn)的數(shù)據(jù)和日志不一致問(wèn)題,需要把binlog格式設(shè)置為row,也就是說(shuō)采用“RC隔離級(jí)別+日志格式binlog_format=row”組合。

三、總結(jié) RR隔離級(jí)別下間隙鎖才有效,RC隔離級(jí)別下沒(méi)有間隙鎖; RR隔離級(jí)別下為了解決“幻讀”問(wèn)題:“快照讀”依靠MVCC控制,“當(dāng)前讀”通過(guò)間隙鎖解決; 間隙鎖和行鎖合稱(chēng)next-key lock,每個(gè)next-key lock是前開(kāi)后閉區(qū)間; 間隙鎖的引入,可能會(huì)導(dǎo)致同樣語(yǔ)句鎖住更大的范圍,影響并發(fā)度。

到此這篇關(guān)于MySQL如何解決幻讀問(wèn)題的文章就介紹到這了,更多相關(guān)MySQL 幻讀內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: MySQL 數(shù)據(jù)庫(kù)
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
成人av第一页| 一区二区精品| 亚洲高清在线播放| 欧美精品一区男女天堂| 激情五月激情综合网| 免费永久网站黄欧美| 亚洲欧美视频在线观看| 欧美日韩亚洲一区二区三区在线| 日韩女同互慰一区二区| 国产自产视频一区二区三区| 91久久精品午夜一区二区| 亚洲成人先锋电影| 一区二区精品在线| 亚洲理论在线观看| 亚洲国产三级| 亚洲婷婷综合色高清在线| 欧美激情一区| 欧美精品一区二区久久婷婷| 国产精品18久久久久久vr| 欧美日韩中文字幕一区| 久久av资源站| 欧美一区二区三区四区久久| 国产成人福利片| 日韩一区二区免费在线观看| 高清不卡在线观看| 91精品国产色综合久久| 国产精品综合在线视频| 欧美一级搡bbbb搡bbbb| 国产乱码字幕精品高清av| 欧美一区二区三区日韩| 国产精品1024| 欧美一级在线免费| 成人av资源站| 欧美精品一区二区三| 99久久久久免费精品国产| 久久女同精品一区二区| 91色婷婷久久久久合中文| 国产日韩欧美亚洲| 国产精品www994| 中文字幕中文字幕一区| 99成人在线| 亚洲国产精品久久人人爱蜜臀| 亚洲一区二区毛片| 日韩精品乱码av一区二区| 欧美性猛交xxxx乱大交退制版 | 日本高清不卡在线观看| 天堂va蜜桃一区二区三区 | 精品久久久影院| 欧美不卡一卡二卡免费版| 国产精品电影一区二区三区| 国产精品日韩久久久| 日韩av中文在线观看| 欧美日本国产视频| 国产成人av电影在线播放| 久久午夜免费电影| 国产综合自拍| 亚洲一区二区三区视频在线播放| 久久久久欧美精品| 激情综合亚洲精品| www日韩大片| 99日韩精品| 久久激情五月激情| 欧美r级电影在线观看| 午夜欧美精品久久久久久久| 亚洲精品免费播放| 色成年激情久久综合| 成人一区在线观看| 国产精品乱子久久久久| 欧美一级二区| 国产综合色产在线精品| 日本一区二区视频在线观看| 久久大香伊蕉在人线观看热2| 免费成人性网站| 欧美一级二级三级乱码| 午夜精品亚洲| 午夜精品成人在线视频| 91精品国产高清一区二区三区蜜臀 | 一区二区三区成人| 色先锋资源久久综合| 国产一区二区三区电影在线观看 | 国产日韩精品一区二区三区在线| 亚洲少妇自拍| 国产精品亚洲一区二区三区在线| 国产午夜亚洲精品羞羞网站| 欧美亚洲视频| 懂色av中文字幕一区二区三区| 国产精品视频yy9299一区| 麻豆av福利av久久av| 国产传媒一区在线| 亚洲天堂免费看| 欧美在线不卡视频| 你懂的国产精品| 日韩成人精品在线观看| 2020国产精品自拍| 亚洲一区区二区| 成人av资源在线| 亚洲国产精品久久久久婷婷884 | 欧美变态tickle挠乳网站| 国产日韩一区二区| 成人免费的视频| 亚洲国产精品影院| 欧美成人三级电影在线| 国产精品一区二区三区四区五区| 国产成人精品亚洲777人妖| 一区二区三区中文字幕| 日韩欧美123| 久久人人97超碰国产公开结果| 不卡av在线网| 蜜桃久久精品一区二区| 中文字幕精品一区二区三区精品| 91激情五月电影| 激情视频一区| 国产成人午夜精品5599| 亚洲一区欧美一区| 久久久久久久综合| 欧美亚洲日本国产| 1024亚洲| 成人精品免费视频| 日本91福利区| 国产精品国产精品国产专区不蜜| 欧美日韩国产123区| 99riav国产精品| 色综合久久中文综合久久牛| 男人的天堂久久精品| 国产精品视频第一区| 日韩视频不卡中文| 欧美专区一区二区三区| 女主播福利一区| 国产一区二区91| 亚洲成人综合视频| 亚洲国产精品成人久久综合一区 | 亚洲欧洲综合另类| 欧美xingq一区二区| 看欧美日韩国产| 亚洲欧洲三级| 女人色偷偷aa久久天堂| 国产专区综合网| 亚洲综合图片区| 国产欧美一区二区精品性色超碰| 欧美性大战xxxxx久久久| 国产日韩欧美一区在线| 欧美极品一区| 成人在线一区二区三区| 久久不见久久见免费视频1| 亚洲一区二区中文在线| 国产精品欧美极品| 精品久久一二三区| 91精品国产麻豆国产自产在线| 色诱视频网站一区| 99热免费精品| 国内精品嫩模av私拍在线观看| 成人免费三级在线| 韩国理伦片一区二区三区在线播放| 亚洲国产精品久久久男人的天堂 | 久久精品免费看| 日韩成人午夜电影| 亚洲丰满少妇videoshd| 中文字幕一区日韩精品欧美| 久久久久久久电影| 精品国产网站在线观看| 正在播放一区二区| 在线成人免费视频| 欧美三级电影网站| 日本电影亚洲天堂一区| 久久精品官网| 国产偷自视频区视频一区二区| 国产精品二区在线| 欧美精品网站| 女人天堂亚洲aⅴ在线观看| 91在线观看污| 成人av在线播放网站| 国产成人精品1024| 国产成人综合在线| 国产不卡高清在线观看视频| 国产一区在线精品| 韩国理伦片一区二区三区在线播放| 久草在线在线精品观看| 久久国产麻豆精品| 蜜桃视频一区二区| 久久99久久99精品免视看婷婷| 裸体歌舞表演一区二区| 秋霞av亚洲一区二区三| 日本不卡的三区四区五区| 丝袜亚洲精品中文字幕一区| 亚洲成年人网站在线观看| 亚洲高清不卡在线| 视频一区二区欧美| 麻豆精品在线视频| 激情六月婷婷综合| 国产精品一区二区男女羞羞无遮挡| 激情另类小说区图片区视频区| 国产精品一区二区三区99| 国产精品一区二区x88av| 国产激情一区二区三区四区 | 一本久道久久综合狠狠爱| 亚洲三级电影在线观看| 亚洲精品在线观看免费| 99精品久久久| 久久久久se| 欧美视频三区在线播放|