日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

MySQL如何解決幻讀問題

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

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

在探討前可以看下之前的博文(MySQL是如何實現事務隔離?),主要介紹隔離級別的具體技術細節,讀過以后看此篇文章可能更有幫助。

注:本博文討論的“幻讀”都是指在“可重復讀”隔離級別下進行。

一、什么是幻讀?

假設我們有表t結構如下,里面的初始數據行為:(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)

假設select * from where value=1 for update,只在這一行加鎖(注意這只是假設),其它行不加鎖,那么就會出現如下場景:

MySQL如何解決幻讀問題

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

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

其中Q3讀到value=1這一樣的現象,就稱之為幻讀,幻讀指的是一個事務在前后兩次查詢同一個范圍的時候,后一次查詢看到了前一次查詢沒有看到的行。

先對“幻讀”做出如下解釋:

在可重復讀隔離級別下,普通的查詢是快照讀,是不會看到別的事務插入的數據的。因此, 幻讀在“當前讀”下才會出現(三個查詢都是for update表示當前讀); 上面session B的修改update結果,被session A之后的select語句用“當前讀”看到,不能稱為幻讀,幻讀僅專指“新插入的行”。二、幻讀有什么問題?(1)需要單獨解決

眾所周知,select ...for update語句就是將相應的數據行鎖住,比如session A在T1時刻的Q1查詢語句:select * from where value=1 for update就是將value=1的數據行鎖住,但顯然如果是上述的場景發生,此時的for update語義被破壞了(并沒有鎖住value=1的數據行)。

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

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

間隙鎖引入以后,可能會導致同樣語句鎖住更大的范圍,這可能就會影響了并發度。具體請看下面介紹

三、如何解決幻讀?

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

間隙:比如表中加入6個記錄,0,5,10,15,20,25。則產生7個間隙:

MySQL如何解決幻讀問題

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

間隙鎖和行鎖合稱next-key lock,每個next-key lock是前開后閉區間(間隙鎖開區間,next-key lock前開后閉區間):

間隙鎖與間隙鎖之間是不存在沖突的,沖突的是往間隙里插入一條記錄。 

MySQL如何解決幻讀問題

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

在表t初始化后,假設表的數據如下:

MySQL如何解決幻讀問題

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

間隙鎖的引入,可能會導致同樣的語句鎖住更大的范圍,是會影響了并發度

假設發生如下場景:

MySQL如何解決幻讀問題

 則明顯發生了死鎖,分析如下:

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

有上述可知間隙鎖的引入,可能會導致同樣語句鎖住更大的范圍,這其實是影響了并發度。

為了解決幻讀問題可以采用讀可提交隔離級別,間隙鎖是在可重復讀隔離級別下才會生效的。所以如果把隔離級別設置為讀提交的話, 就沒有間隙鎖了。但同時,你要解決可能出現的數據和日志不一致問題,需要把binlog格式設置為row,也就是說采用“RC隔離級別+日志格式binlog_format=row”組合。

三、總結 RR隔離級別下間隙鎖才有效,RC隔離級別下沒有間隙鎖; RR隔離級別下為了解決“幻讀”問題:“快照讀”依靠MVCC控制,“當前讀”通過間隙鎖解決; 間隙鎖和行鎖合稱next-key lock,每個next-key lock是前開后閉區間; 間隙鎖的引入,可能會導致同樣語句鎖住更大的范圍,影響并發度。

到此這篇關于MySQL如何解決幻讀問題的文章就介紹到這了,更多相關MySQL 幻讀內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MySQL 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产视频网站一区二区三区| 99久久久久国产精品| 国产伊人精品| 日韩免费高清| 久久精品国产99久久| 亚洲一区二区三区四区五区午夜 | 精品午夜av| 三级在线看中文字幕完整版| 久久九九电影| 中文字幕成人| 精品国产亚洲一区二区三区| 日韩精品网站| 亚洲精品第一| 国产精品久久久久久久免费观看 | 欧美1区2区3| 日韩高清中文字幕一区二区| 亚洲狼人精品一区二区三区| 欧美伊人影院| 国产在线|日韩| 日韩精品国产欧美| 亚洲精品福利电影| 欧美一区二区三区免费看| 日韩成人a**站| 亚洲精品影视| 日韩欧美一区免费| 国产日韩欧美中文在线| 亚洲午夜黄色| 国产suv精品一区二区四区视频| 免费日韩精品中文字幕视频在线| 麻豆精品在线观看| 蜜桃免费网站一区二区三区| 97精品视频在线看| 亚洲欧美日韩高清在线| 国产精品久久久久77777丨| 国产日韩专区| 日韩专区一卡二卡| sm久久捆绑调教精品一区| 午夜国产精品视频免费体验区| 亚洲精品欧美| 欧美欧美黄在线二区| 欧美日韩国产传媒| 亚洲大片在线| 丝袜美腿一区二区三区| 日韩精品一区二区三区中文在线 | 日韩制服丝袜av| 国产精品普通话对白| 久久超碰99| 18国产精品| 亚洲有吗中文字幕| 亚洲电影在线一区二区三区| 中文一区一区三区高中清不卡免费| 欧美亚洲三区| 亚洲精品动态| 综合激情五月婷婷| 五月综合激情| 久久免费黄色| 超级白嫩亚洲国产第一| 欧美激情精品| 国产人成精品一区二区三| 免费在线观看视频一区| 在线国产一区| 欧美中文日韩| 三级一区在线视频先锋| 亚洲色图国产| 少妇精品久久久| 日韩精品欧美大片| 久久国产精品美女| 国产传媒av在线| 成人小电影网站| 日韩精品免费一区二区三区| 黄色不卡一区| 久久不射网站| 日本综合精品一区| 日韩国产高清在线| 精品国产亚洲一区二区三区在线| 亚洲特级毛片| 91精品国产一区二区在线观看| 日产精品一区二区| 亚洲视频二区| 日本不卡免费高清视频在线| 老鸭窝亚洲一区二区三区| 久久亚洲黄色| 亚洲精品无播放器在线播放| 日韩电影免费网站| 日韩免费精品| 亚洲国产一区二区在线观看| 国产一区二区三区日韩精品| 日韩精品一卡二卡三卡四卡无卡| 国产精品国码视频| 天堂成人国产精品一区| 福利一区和二区| 欧美日韩18| 日韩在线播放一区二区| 欧美va天堂在线| 久久wwww| 日韩黄色av| 欧美在线综合| 中文在线一区| 久久精品国产亚洲夜色av网站| 国产精品日韩精品中文字幕| 免费视频一区二区| 免费人成精品欧美精品| 国产精品社区| 婷婷成人在线| 成人久久一区| 久久国产中文字幕| 欧美成人a交片免费看| 美女视频免费精品| 欧美激情精品| 国产一区调教| 日韩av福利| 国产精选在线| 成人日韩精品| 欧美精品一区二区久久| 天堂av在线| 免费高潮视频95在线观看网站| 在线天堂中文资源最新版| 国产国产精品| 男女性色大片免费观看一区二区| 欧美日韩四区| 久久亚洲一区| 美女精品视频在线| 亚洲精品第一| 国产婷婷精品| 国产精品99精品一区二区三区∴| 亚洲午夜天堂| 日本aⅴ亚洲精品中文乱码| 免费精品一区| 蜜臀av一区二区三区| 婷婷激情久久| 在线日韩视频| 国产精品亚洲欧美一级在线| 欧美成人一二区| caoporn视频在线| 国产99久久| 国产欧美日韩在线一区二区 | 色狠狠一区二区三区| 精品一区视频| 亚洲另类av| 日韩中文在线电影| 日韩一区二区三区高清在线观看| 精品99在线| 中文字幕av一区二区三区人| 日韩精品专区| 国产日产一区| 国产精品美女久久久浪潮软件| 久久精品资源| 亚洲在线免费| 日韩成人精品一区二区| 奇米亚洲欧美| 久久久9色精品国产一区二区三区| 色老板在线视频一区二区| 欧美日韩91| 99re国产精品| 香蕉精品久久| 国产不卡av一区二区| 国产欧美69| 欧美91精品| 鲁鲁在线中文| 精品一区欧美| 国产精品va视频| 日韩中文影院| 欧美va天堂| 久久99精品久久久野外观看| 97精品国产福利一区二区三区| 久久婷婷国产| 国产一区二区精品| 亚洲大片在线| 视频一区二区欧美| 一区二区三区四区在线观看国产日韩 | 亚洲小说欧美另类婷婷| 亚洲精品一区二区在线看| 久久久久久夜| 99精品国产一区二区三区| 久久av资源| 午夜在线一区二区| 国产成人免费av一区二区午夜| 超级白嫩亚洲国产第一| 99久久九九| 激情中国色综合| 91亚洲无吗| 国产福利电影在线播放| 日韩一区二区三区高清在线观看| 精品视频黄色| 国产一区二区亚洲| 国际精品欧美精品| 国产偷自视频区视频一区二区| 中文另类视频| 激情婷婷久久| 蜜臀国产一区二区三区在线播放| 国产乱子精品一区二区在线观看| 国产成人精品亚洲日本在线观看| 中文字幕亚洲影视| 欧美男人天堂| 欧美精品三级在线| 日韩高清成人| 国产精品永久| 亚洲欧美伊人| 精品一区二区三区四区五区| 久久不射中文字幕|