欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

mysql間隙鎖GapLock

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

堅守“ 做人真誠 · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價值觀,專業(yè)網(wǎng)站建設服務10余年為成都木托盤小微創(chuàng)業(yè)公司專業(yè)提供企業(yè)網(wǎng)站建設營銷網(wǎng)站建設商城網(wǎng)站建設手機網(wǎng)站建設小程序網(wǎng)站建設網(wǎng)站改版,從內(nèi)容策劃、視覺設計、底層架構、網(wǎng)頁布局、功能開發(fā)迭代于一體的高端網(wǎng)站建設服務。

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

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

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

默認情況下,InnoDB工作在可重復讀隔離級別下,并且以Next-Key Lock的方式對數(shù)據(jù)行進行加鎖,這樣可以有效防止幻讀的發(fā)生。Next-Key Lock是行鎖與間隙鎖的組合,這樣,當InnoDB掃描索引記錄的時候,會首先對選中的索引記錄加上行鎖(Record Lock),再對索引記錄兩邊的間隙(向左掃描掃到第一個比給定參數(shù)小的值, 向右掃描掃描到第一個比給定參數(shù)大的值, 然后以此為界,構建一個區(qū)間)加上間隙鎖(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);

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

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); 執(zhí)行時就會爆出死鎖錯誤。因為刪除taskId = 20這條記錄的時候,20 --  41 都被鎖住了, 他們都取得了這一個數(shù)據(jù)段的共享鎖, 所以在獲取這個數(shù)據(jù)段的排它鎖時出現(xiàn)死鎖。

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

 

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

本文標題:mysql間隙鎖GapLock
文章來源:http://chinadenli.net/article40/goipeo.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信小程序網(wǎng)站改版虛擬主機外貿(mào)建站小程序開發(fā)建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作