一:到底都有哪些鎖
學習鎖之前,必須要知道鎖大概有幾種???通常情況下作為碼農我們隻需知道如下幾個鎖即可。。。
1.S(Share)鎖
為了友善了解,我們可以直接這麼認為,當在select的時候在表,資料頁,記錄上加上共享鎖。
2.X(Exclusive) 鎖
我們在delete資料的時候會在記錄上附加X鎖,我們知道X鎖并不與其他的鎖相容。如果其他的鎖與其遭遇,就會處于等待,後續我們再說。
3.U(Update)鎖
顧名思義,我們在Update的時候,在尋找記錄的過程中,會逐一的給記錄附加U鎖,如果找到了目标記錄的話,則會将U鎖轉化為X鎖。。。
4.I (Intent)鎖
這個就是所謂的意向鎖,一般都是給表和資料頁附加的鎖,好處就是防止被其他連接配接修改表結構。
二:天下無敵的SqlServer Profile
這個工具我想大家都明白,它的監視能力真的是無所不能。。。鎖的痙攣狀态也全在它的掌握之中。
1. 首先我做一個Person表,Name字段設定4000位元組,這樣一個資料頁可以容納2條資料,如下圖:
DROP TABLE dbo.Person
CREATE TABLE Person(ID INT IDENTITY,NAME CHAR(4000) DEFAULT 'aaaaa')
--插入6條,生成3個資料頁
INSERT INTO dbo.Person DEFAULT VALUES
go 6
2. 下面我們看看資料在資料頁的分布情況。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAnYldHL0FWby9mZvwFN4ETMfdHLkVGepZ2XtxSZ6l2clJ3LcV2Zh1Wa9M3clN2byBXLzN3btgHL9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsQTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CM0IjNyYGNmBTZwYjY3AjZyYzXyMjN1ATM4AzLchDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
3. 然後我們開啟Profile,在“事件選擇”的Events中選擇”Lock:Acquired“和”Lock:Released“ ,然後運作,如下圖:
三:使用測試資料
1. 首先我執行一個簡單的 SELECT * FROM dbo.Person,看看表/資料頁/記錄的加鎖情況。
從圖中可以看到,select執行的大概步驟如下:
第一步:給表(Object)加上IS(意向共享鎖)。
第二步:先給1:78号資料頁加IS鎖,掃描78号資料頁,然後釋放IS鎖。
第三步:同樣的道理掃描之後的資料頁。
第四步:最後釋放表的IS鎖,結束整個鎖流程。
看完上面的一系列的Lock:Acquired 和 Lock:Released的話,你有沒有發現一個問題,不是說好給記錄(RID)加上S鎖麼???這裡沒加,
是因為引擎進入78号資料頁的時候,未發現它存在IU鎖或者IX鎖。。。是以。。。這個屬于鎖的組合,後續會說。
2. 接下來用UPDATE dbo.Person SET NAME='bbbbb' WHERE ID=3來看看update的整個過程,乍一看,Profile捕獲到的記錄還是比較多
的,下面具體看圖:
第一步: 給表(Object)加上IX鎖,
第二步: 給資料頁(1:78)資料頁配置設定IU鎖。然後開始逐一掃描78号資料頁的RID記錄,進入前就Acquired,退出後就Released,當掃
描完78号資料頁的所有RID後,再釋放78号資料頁的IU鎖,進入下一個資料頁。。。
第三步: 我們發現ID=3是在89号資料頁上,當引擎掃到該RID之後,我們觀察到89号的資料頁由IU鎖變成了IX鎖,并且把1:89:0(slot
為0的記錄)由U鎖變成X鎖,變成X鎖後,就排斥了其他所有的鎖,這時候就可以進行Update操作了。
第四步: 後面就繼續90号資料頁,步驟類似,第二步和第三步。
不知道細心的你有沒有發現,在Released Object之前我們才釋放1:89:0的X鎖,然後釋放89号資料頁的IX鎖,這說明什麼???說明這個
Update是貫穿于這個事務的,不像Select操作中,掃完一個資料頁就釋放一個資料頁。
3. 最後再看一個DELETE FROM dbo.Person WHERE ID=3 的操作。
大概掃了一下上面的圖,或許你感覺和Update操作大差不差,會掃描資料頁中的每個記錄并加上U鎖。當在1:89:0槽位中找到了目
标記錄後,然後将U鎖轉化為X鎖,具體可以參考Update。