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

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

MySQL如何解決幻讀問題

瀏覽:217日期: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久久,三上悠亚国产精品一区二区三区
欧美亚洲三区| 国产日产一区| 肉色欧美久久久久久久免费看| 国产伦一区二区三区| 蜜桃久久av| 久久亚洲欧美| 日本成人中文字幕在线视频| 四虎精品永久免费| 日韩国产欧美在线播放| 欧美日韩xxxx| 你懂的国产精品| av中文资源在线资源免费观看| 亚洲播播91| 亚洲激情社区| 日韩激情av在线| 久久精品国产福利| 视频二区不卡| 久久亚洲精品伦理| 欧美一区网站| 九九99久久精品在免费线bt| 97se综合| 西西人体一区二区| 日韩精品国产欧美| 久久久免费人体| 日韩网站中文字幕| 99在线精品免费视频九九视 | 久久国产中文字幕| 日韩一区二区免费看| 日韩有码av| 精品免费视频| 国产一区清纯| 天海翼亚洲一区二区三区| 国产精品自拍区| 91麻豆国产自产在线观看亚洲| 欧美日韩国产高清电影| 深夜福利一区| 日本久久黄色| 久热精品在线| 美女av一区| 欧美日韩国产在线一区| 欧美影院精品| 久久久久网站| 日韩专区视频网站| 国产一区二区三区不卡视频网站 | 999久久久亚洲| 亚洲精品乱码| 国产成人免费av一区二区午夜| 久久精品国产68国产精品亚洲| 欧美在线不卡| 久久中文字幕二区| 欧美日本精品| 日韩免费一区| 亚洲一区二区av| 超碰成人av| 日韩在线网址| 亚洲国产专区| 麻豆视频一区二区| 在线国产精品一区| 免费一二一二在线视频| 欧美日韩精品一区二区三区视频| 日韩不卡免费高清视频| 欧美在线日韩| 亚洲综合三区| 久久青青视频| 日韩精彩视频在线观看| 日韩网站中文字幕| 奇米狠狠一区二区三区| 久久亚洲在线| 麻豆精品在线观看| 久久最新视频| 欧美成人基地 | 天堂√8在线中文| 日韩中文字幕| 免费不卡中文字幕在线| 国产精品一区二区三区www| 久久精品不卡| 精品国产网站| 青青草91视频| 国产精品呻吟| 超碰99在线| 国产精品一区二区三区av| 免费观看在线色综合| 久久久久久久久久久妇女| 欧美aa在线视频| 日韩高清欧美激情| 99视频+国产日韩欧美| 日韩黄色大片| 你懂的国产精品| 日本欧美在线| 伊人成人网在线看| 欧美丰满日韩| 欧美a一区二区| 久久国产三级| 日韩欧美中文字幕在线视频| 99国产精品自拍| 欧美aa国产视频| 国产亚洲一区二区手机在线观看| 精品久久久中文字幕| 国产精选一区| 久久国际精品| 欧美亚洲福利| 日本少妇一区二区| 亚洲综合婷婷| 视频一区二区不卡| 婷婷成人在线| 色爱综合av| 色天使综合视频| 日韩在线欧美| 亚洲风情在线资源| 中文在线а√天堂| 国产成人久久精品一区二区三区| 久久不见久久见免费视频7| 日韩国产在线观看一区| 亚洲精品欧洲| 午夜久久av| 日本一不卡视频| 日韩亚洲精品在线观看| 日本午夜免费一区二区| 日韩不卡一区二区| 亚洲开心激情| 亚洲另类视频| 国产欧美亚洲一区| 国产精品免费不| 麻豆精品在线观看| 日产精品一区二区| 日本а中文在线天堂| 视频福利一区| 免费精品国产的网站免费观看| 亚洲精品一区二区妖精| 99成人在线| 亚洲精品女人| 国产亚洲一区二区三区啪| 国产精品一区二区三区www| 国产福利亚洲| 久久精品色播| 天堂8中文在线最新版在线| 久久中文视频| 亚洲一区二区三区高清| 免费中文字幕日韩欧美| 亚洲综合专区| 国产精品一区二区免费福利视频| 国产精品久久久久久久久久白浆| 欧美激情 亚洲a∨综合| 激情国产在线| 亚洲少妇一区| 国产欧美日韩影院| 久久精品国产免费| 色老板在线视频一区二区| 国产精品人人爽人人做我的可爱 | 久久精品免费一区二区三区 | 婷婷久久一区| 综合视频一区| 你懂的国产精品| 伊人精品一区| 少妇精品在线| 国产成人在线中文字幕| 久久五月天小说| 中文字幕av一区二区三区四区| 国产福利一区二区精品秒拍 | 三级亚洲高清视频| 日韩国产在线一| 91亚洲一区| 亚洲自拍另类| 久久不见久久见中文字幕免费| 亚洲天堂一区二区| 中文字幕亚洲精品乱码| 精品亚洲免a| 野花国产精品入口| 欧美日韩亚洲国产精品| 中国字幕a在线看韩国电影| 国产精品呻吟| 免费日韩成人| 午夜久久黄色| 国产三级一区| 久久精品观看| 日本一区二区三区视频在线看| 国产福利91精品一区二区| 免费日韩av| 欧美国产偷国产精品三区| 国产一区白浆| 激情不卡一区二区三区视频在线| 伊人久久成人| 美女精品久久| 久久高清一区| 精品国产网站| 综合一区二区三区| 黄在线观看免费网站ktv| 丝袜美腿一区二区三区| 国内在线观看一区二区三区| 亚洲少妇自拍| 美女久久久久久| 爽好久久久欧美精品| 成人影视亚洲图片在线| 日韩国产一区二| 精品91久久久久| 国产黄大片在线观看| 日本精品国产| 99在线观看免费视频精品观看| 成人在线视频免费看| 亚洲日产av中文字幕|