這四種隔離級別,當(dāng)存在多個事務(wù)并發(fā)沖突的時候,可能會出現(xiàn)臟讀,不可重復(fù)讀,幻讀的一些問題,而innoDB在可重復(fù)讀隔離級別模式下解決了幻讀的一個問題,
幻讀是指在同一個事務(wù)中,前后兩次查詢相同范圍的時候得到的結(jié)果不一致
如圖,第一個事務(wù)里面,我們執(zhí)行一個范圍查詢,這個時候滿足條件的數(shù)據(jù)只有一條,而在第二個事務(wù)里面,它插入一行數(shù)據(jù)并且進(jìn)行了提交,接著第一個事務(wù)再去查詢的時候,得到的結(jié)果比第一次查詢的結(jié)果多出來一條數(shù)據(jù),注意第一個事務(wù)的第一次和第二次查詢,都在同一個事物里面,所以,幻讀會帶來數(shù)據(jù)一致性的問題
InnoDB引入間隙鎖和next-key lock機(jī)制去解決幻讀問題
假如現(xiàn)在存在這樣一個B+Tree的索引結(jié)構(gòu),這個結(jié)構(gòu)有4個索引元素,分別是1,4,7,10 當(dāng)我們通過主鍵索引查詢一條記錄,并且對這條記錄通過for update加鎖的時候
這個時候會產(chǎn)生一個記錄鎖,也就是行鎖,鎖定id=1這個索引
被鎖定的記錄在鎖釋放之前,其他事務(wù)無法對這一條記錄做任何操作的,前面我們所過對幻讀的定義,幻讀是指在同一個事務(wù)中,前后兩次查詢相同范圍的時候得到的結(jié)果不一致,注意這里敲掉的是范圍查詢,也就是說要解決幻讀的問題,必須保證一個點(diǎn)
就是如果一個事務(wù)通過這樣一條語句進(jìn)行鎖定的時候,另外一個事務(wù)再執(zhí)行
這樣一條insert語句需要被阻塞,直到前面獲得所的事務(wù)被釋放,所以在innonDB設(shè)計(jì)一種間隙鎖,它的主要功能是鎖定一定范圍內(nèi)的索引記錄
當(dāng)對查詢范圍id > 4 and id
這條查詢語句針對id > 4這個條件加鎖,那么它需要鎖定多個索引區(qū)間,所以這個情況下InnoDB引入一個叫next-key lock機(jī)制,next-key lock相當(dāng)于間隙鎖和記錄鎖的合集,記錄鎖鎖定存在記錄的行,間隙鎖鎖住的是記錄行之間的間隙,而next-key lock鎖住的是兩者的和
每個數(shù)據(jù)行非唯一的索引列,都會存在一把next-key lock,當(dāng)某個事務(wù)持有這一行數(shù)據(jù)的next-key lock的時候,會鎖住一段在左開右閉區(qū)間的數(shù)據(jù),因此當(dāng)通過id > 4這樣一個范圍加鎖的時候,InnoDB會去加一個next-key lock鎖,鎖定的區(qū)間范圍是(4,7 ](7,10 ](10,+?? ]。間隙鎖和next-key lock的區(qū)別是在加鎖的范圍,間隙鎖鎖定的是兩個索引之間的間隙,而next-key lock會鎖定多個索引區(qū)間,它包含記錄鎖和間隙鎖當(dāng)我們使用范圍查詢不僅僅命中Record記錄,還包含了Gap間隙的時候,在這種情況下使用的就是臨鍵鎖,也就是next-key lock它是Mysql里面默認(rèn)的行鎖算法
以上就是Mysql中的innoDB怎么解決幻讀的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進(jìn)程會占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://www.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號