91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mysql 間隙鎖 Gap Lock

發布時間:2020-08-02 05:28:51 來源:網絡 閱讀:3965 作者:xiaojing413332 欄目:MySQL數據庫

  MySQL InnoDB支持三種行鎖定方式:

行鎖(Record Lock):鎖直接加在索引記錄上面。

間隙鎖(Gap Lock):鎖加在不存在的空閑空間,可以是兩個索引記錄之間,也可能是第一個索引記錄之前或最后一個索引之后的空間。

Next-Key Lock:行鎖與間隙鎖組合起來用就叫做Next-Key Lock。

默認情況下,InnoDB工作在可重復讀隔離級別下,并且以Next-Key Lock的方式對數據行進行加鎖,這樣可以有效防止幻讀的發生。Next-Key Lock是行鎖與間隙鎖的組合,這樣,當InnoDB掃描索引記錄的時候,會首先對選中的索引記錄加上行鎖(Record Lock),再對索引記錄兩邊的間隙(向左掃描掃到第一個比給定參數小的值, 向右掃描掃描到第一個比給定參數大的值, 然后以此為界,構建一個區間)加上間隙鎖(Gap Lock)。如果一個間隙被事務T1加了鎖,其它事務是不能在這個間隙插入記錄的。

舉個例子:

表task_queue

Id           taskId

1              2

3              9

10            20

40            41


開啟一個會話: session 1

sql> set autocommit=0;

   ##

取消自動提交

sql> delete from task_queue where taskId = 20;

sql> insert into task_queue values(20, 20);


在開啟一個會話: session 2

sql> set autocommit=0;

   ##

取消自動提交

sql> delete from task_queue where taskId = 25;

sql> insert into task_queue values(30, 25);


在沒有并發,或是極少并發的情況下, 這樣會可能會正常執行,在Mysql中, 事務最終都是穿行執行, 但是在高并發的情況下, 執行的順序就極有可能發生改變, 變成下面這個樣子:

sql> delete from task_queue where taskId = 20;

sql> delete from task_queue where taskId = 25;

sql> insert into task_queue values(20, 20);

sql> insert into task_queue values(30, 25);


這個時候最后一條語句:insert into task_queue values(30, 25); 執行時就會爆出死鎖錯誤。因為刪除taskId = 20這條記錄的時候,20 --  41 都被鎖住了, 他們都取得了這一個數據段的共享鎖, 所以在獲取這個數據段的排它鎖時出現死鎖。


間隙鎖在InnoDB的唯一作用就是防止其它事務的插入操作,以此來達到防止幻讀的發生,所以間隙鎖不分什么共享鎖與排它鎖。另外,在上面的例子中,我們選擇的是一個普通(非唯一)索引字段來測試的,這不是隨便選的,因為如果InnoDB掃描的是一個主鍵、或是一個唯一索引的話,那InnoDB只會采用行鎖方式來加鎖,而不會使用Next-Key Lock的方式,也就是說不會對索引之間的間隙加鎖,仔細想想的話,這個并不難理解,大家也可以自己測試一下。

 

要禁止間隙鎖的話,可以把隔離級別降為讀已提交,或者開啟參數innodb_locks_unsafe_for_binlog。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宣武区| 玛沁县| 玉溪市| 武清区| 祁连县| 安仁县| 丰顺县| 大城县| 威远县| 铁岭市| 巴南区| 石河子市| 宜城市| 榆中县| 林州市| 资源县| 合作市| 天峻县| 沙雅县| 阿克陶县| 马边| 岳普湖县| 阿克| 施秉县| 巴塘县| 沈丘县| 栖霞市| 虹口区| 阿拉善盟| 满城县| 得荣县| 崇义县| 包头市| 南川市| 太湖县| 乌鲁木齐县| 深水埗区| 揭东县| 桓台县| 镇巴县| 北京市|