最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL串行化隔離級別(間隙鎖實現)

 更新時間:2022年06月15日 15:10:21   作者:菜鳥~~  
本文主要介紹了MySQL串行化隔離級別(間隙鎖實現),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

串行化隔離級別怎么解決幻讀問題?
先說下幻讀的含義,幻讀就是在事務中按照同樣的條件前后兩次查詢的結果數據量不同。

解決串行化的幻讀問題用間隙鎖(gap lock),間隙鎖是給不存在的記錄加鎖,要正確理解間隙,知道間隙的范圍。條件無非就是兩類:范圍查詢和等值查詢。再說下范圍查詢和等值查詢都是怎么加間隙鎖的,分別從主鍵索引和輔助索引兩個場景來說。

一、間隙鎖的概念

我們把事務2 select的指定的條件分為2類:范圍查詢、等值查詢

record lock(記錄鎖,就是行鎖)
gap lock(間隙鎖)
next-key lock:record lock 和 gap lock

二、測試間隙鎖范圍加鎖

設置事務為手動提交,隔離級別設置成串行化

查看表結構,id、age和name都有索引

場景1:用不可重復的主鍵id測試間隙鎖

做范圍查詢

事務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的數據。

場景2:用可重復的age(有索引)測試間隙鎖

測試輔助索引樹上,間隙鎖的范圍

我們先查看表結構、表數據,然后回滾。

根據表的內容建簡單的輔助索引

開啟事務進行測試

很明顯,由于age>20的區(qū)間都被事務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上鎖的范圍,所以可以插入

場景3:實際情況需要具體分析用的到底是行鎖還是表鎖

回滾,重新開啟事務

開始測試

我們發(fā)現事務1無論是插入age>18范圍內的數據,還是范圍外的數據,都無法成功

這時我們就要分析了,這應該沒有用到索引,因為我們用索引,過濾出的數據占了整張表的一大半,MySQL server沒使用索引。

沒有加行鎖,只能加表鎖(這時加的是共享鎖),所以事務1無論插入什么數據都不行

果然,沒有用到索引

age>20用到了索引,所以可以用行鎖

三、測試間隙鎖等值加鎖

查看表結構和表數據

設置手動提交,設置串行化隔離級別,回滾然后啟動事務

1. 測試不能重復的主鍵索引

此時事務2做select操作,由于是等值查詢,所以給這條數據加了共享鎖。

事務2的主鍵或者唯一鍵進行等值查詢的時候,事務1插入一個新的數據是可以成功的,因為主鍵id不能重復,我們不能再插入主鍵id=9的數據。

在這種情況下,主鍵或者唯一鍵是不能重復的,事務2進行等值查詢時,事務1插入一個新的數據,不用擔心這條數據和查詢條件是一樣的,所以肯定能成功

2. 測試能重復的輔助索引

回滾并重啟事務

事務2等值查詢,給age=18這行數據加上了共享鎖(record-lock)

這是一個等值查詢,而且用的是輔助索引age,那么在輔助索引age的輔助索引樹上葉子節(jié)點存的是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都可以成功,不在間隙鎖范圍內。

間隙鎖是給不存在的數據記錄的范圍加鎖:

  • 對于輔助索引,若值允許重復,在串行隔離級別中如果進行等值查詢,InnoDB會給數據加上行鎖和間隙鎖(防止別的事務插入索引值重復的數據,造成幻讀)
  • 對于主鍵索引,或者唯一鍵索引,值不允許重復,那只需要加行鎖就夠了(對于唯一鍵索引,不可能發(fā)生插入索引值重復的數據)

到此這篇關于MySQL串行化隔離級別(間隙鎖實現)的文章就介紹到這了,更多相關MySQL 間隙鎖內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • mysql之如何把查詢的結果保存到新表

    mysql之如何把查詢的結果保存到新表

    這篇文章主要介紹了mysql之如何把查詢的結果保存到新表問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Mysql數據庫介紹及mysql顯示命令

    Mysql數據庫介紹及mysql顯示命令

    這篇文章主要介紹了Mysql數據庫介紹及mysql顯示命令 的相關資料,需要的朋友可以參考下
    2016-04-04
  • MySQL的日志基礎知識及基本操作學習教程

    MySQL的日志基礎知識及基本操作學習教程

    這篇文章主要介紹了MySQL的日志基礎知識學習教程,包括MySQL中日志相關常用的服務器變量說明,極力推薦!需要的朋友可以參考下
    2015-11-11
  • MySQL死鎖產生的原因和解決方法

    MySQL死鎖產生的原因和解決方法

    死鎖是指兩個或兩個以上的進程在執(zhí)行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去.此時稱系統處于死鎖狀態(tài)或系統產生了死鎖,本文就給大家介紹一下MySQL死鎖產生的原因和解決方法
    2023-07-07
  • CentOS7下二進制安裝mysql 5.7.23

    CentOS7下二進制安裝mysql 5.7.23

    這篇文章主要為大家詳細介紹了CentOS7下二進制安裝mysql 5.7.23,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • MySQL NULL 值處理實例詳解

    MySQL NULL 值處理實例詳解

    這篇文章主要介紹了MySQL NULL 值處理實例詳解的相關資料,需要的朋友可以參考下
    2017-01-01
  • MySQL慢查詢問題排查方式

    MySQL慢查詢問題排查方式

    文章介紹了MySQL慢查詢排查的步驟,包括查看當前正在運行的事務狀態(tài)、查看線程狀態(tài)、殺死線程、輔助判斷命令、開啟慢查詢日志和開啟通用查詢日志
    2025-02-02
  • mySql關于統計數量的SQL查詢操作

    mySql關于統計數量的SQL查詢操作

    這篇文章主要介紹了mySql關于統計數量的SQL查詢操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • MySql獲取某個字段存在于哪個表的sql語句

    MySql獲取某個字段存在于哪個表的sql語句

    本文為大家詳細介紹下通過MySql查詢某個字段所在表是哪一個,具體的sql語句如下,感興趣的朋友可以參考下,希望對大家有所幫助
    2013-07-07
  • MySQL無法輸入中文字符問題的解決辦法

    MySQL無法輸入中文字符問題的解決辦法

    MySQL無法輸入中文的問題大多是由于字符集不匹配所導致的,下面這篇文章主要給大家介紹了關于MySQL無法輸入中文字符問題的解決辦法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05

最新評論

湘潭县| 延边| 库伦旗| 托克逊县| 阿合奇县| 青田县| 富源县| 循化| 仁化县| 乐都县| 满城县| 庄河市| 涿鹿县| 浮山县| 延边| 来宾市| 遂宁市| 苍梧县| 北流市| 南京市| 玛纳斯县| 保山市| 怀来县| 无极县| 康乐县| 确山县| 辽中县| 双江| 图木舒克市| 峡江县| 沅陵县| 会昌县| 衡水市| 尼木县| 贵州省| 涡阳县| 澄城县| 岳阳市| 新蔡县| 襄城县| 桂林市|