<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
序列化隔離級別怎麼解決幻讀問題?
先說下幻讀的含義,幻讀就是在事務中按照同樣的條件前後兩次查詢的結果資料量不同。
解決序列化的幻讀問題用間隙鎖(gap lock),間隙鎖是給不存在的記錄加鎖,要正確理解間隙,知道間隙的範圍。條件無非就是兩類:範圍查詢和等值查詢。再說下範圍查詢和等值查詢都是怎麼加間隙鎖的,分別從主鍵索引和輔助索引兩個場景來說。
我們把事務2 select的指定的條件分為2類:範圍查詢、等值查詢
record lock(記錄鎖,就是行鎖)
gap lock(間隙鎖)
next-key lock:record lock 和 gap lock
設定事務為手動提交,隔離級別設定成序列化
檢視表結構,id、age和name都有索引
做範圍查詢
事務2的select操作只給三行資料加了排它鎖,為什麼插入id=24的資料也不行?
這是因為在序列化隔離級別中,不僅僅是獲取了滿足條件的這3行的行鎖,而且把表資料後邊空洞的地方也上了間隙鎖。
圖中紅色線的地方都上了間隙鎖,上鎖範圍(左開右閉)為:( 11 , 12 ] ∪ ( 12 , 22 ] ∪ ( 22 , 23 ] ∪ ( 23 , + ∞ ]
12,22,23是三個行記錄,因為過濾條件是用id帶有索引的,所以select獲取了12,22,23的共用行鎖(record-lock), 還把間隙加了間隙鎖,其實就是給間隙加上共用鎖或者排他鎖,將間隙鎖和行鎖統稱next-key lock
(record-lock和gap-lock),也就是說where id>11加了next-key lock。正是因為給空洞也加鎖了,所以事務1再想獲取間隙的排它鎖是不可以的,因為共用鎖和排它鎖是不能共存的。
由於事務2是select,所以是給間隙加上了共用鎖,如果事務1做select id>11還是可以的,不能update、insert、delete id>11的資料。
測試輔助索引樹上,間隙鎖的範圍
我們先檢視表結構、表資料,然後回滾。
根據表的內容建簡單的輔助索引
開啟事務進行測試
很明顯,由於age>20的區間都被事務1加上了間隙鎖(這裡加的是共用鎖),所以事務2插入age=22和age=21都失敗了
幻讀就是同一事務兩次用相同的條件查詢資料,下一次查出的資料量和上一次的資料量不一樣,就算事務1把age=20的資料插入表,事務2再用age>20查詢,得到的資料量也不會改變。
那事務1插入age=20的資料能否成功呢?
依然不能成功,這是因為我們插入的資料id是自增的,所以這條資料為(age=20,id=24),位於輔助索引樹中(age=20,id=12)的右邊,由於(age=20,id=12)右邊都被上了鎖,(age=20,id=24)自然無法插入。
輔助索引值相等的話。主鍵按升序排列。
很顯然,事務1插入的age=18和age=19都不在事務2上鎖的範圍,所以可以插入
回滾,重新開啟事務
開始測試
我們發現事務1無論是插入age>18範圍內的資料,還是範圍外的資料,都無法成功
這時我們就要分析了,這應該沒有用到索引,因為我們用索引,過濾出的資料佔了整張表的一大半,MySQL server沒使用索引。
沒有加行鎖,只能加表鎖(這時加的是共用鎖),所以事務1無論插入什麼資料都不行
果然,沒有用到索引
age>20用到了索引,所以可以用行鎖
檢視表結構和表資料
設定手動提交,設定序列化隔離級別,回滾然後啟動事務
此時事務2做select操作,由於是等值查詢,所以給這條資料加了共用鎖。
事務2的主鍵或者唯一鍵進行等值查詢的時候,事務1插入一個新的資料是可以成功的,因為主鍵id不能重複,我們不能再插入主鍵id=9的資料。
在這種情況下,主鍵或者唯一鍵是不能重複的,事務2進行等值查詢時,事務1插入一個新的資料,不用擔心這條資料和查詢條件是一樣的,所以肯定能成功
回滾並重啟事務
事務2等值查詢,給age=18這行資料加上了共用鎖(record-lock)
這是一個等值查詢,而且用的是輔助索引age,那麼在輔助索引age的輔助索引樹上葉子節點存的是age的輔助索引值和它所在行的主鍵值,
事務1插入age=18是不被允許的,否則事務2再查詢age=18就有兩條記錄了。
奇怪的是,我們插入age=17,16,15也被阻塞住了
這是因為,為了防止幻讀,除了age=18這條資料加了共用鎖,其兩側也被加了間隙鎖。
如果插入(age=15,id=1)就可以成功,根據輔助索引值相同,按照主鍵值升序排列,(age=15,id=1)應該放在(age=15,id=7)前面,不在間隙鎖範圍內
插入age=14,13都可以成功,不在間隙鎖範圍內。
間隙鎖是給不存在的資料記錄的範圍加鎖:
到此這篇關於MySQL序列化隔離級別(間隙鎖實現)的文章就介紹到這了,更多相關MySQL 間隙鎖內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45