c1 c2 c3
----------- --------------------- --------------------
3 288.9700 Allan
(所影響的行數為 1 行)
沒有被掛起,一切很好。
此時,還可以發現一個很有趣,很容易迷惑你的現象。
SESSION 4
select * from test where c1<>1
結果也被掛住了,好像ROWLOCK出了“問題”?不要急,原來由於我這個表Test建了主鍵(c1欄位)。我認為這是由於update,delete操作引起了索引上行的lock。
而此時,如果執行select * from test where c1>1是沒有問題的。
那麼,我們只要強制跳過叢集索引的索引頁和索引分葉節點頁(資料頁)中行鎖定的部分。
select * from test with(FASTFIRSTROW) where c1<>1
果然就一切OK。
因此,對於很多現象,我們需要進一步地去思考和去解迷。
下面,我們通過sp_lock查看來在說明一下
通過sp_lock查看:
spid dbid ObjId IndId Type Resource Mode Status
------ ------ ----------- ------ ---- ---------------- -------- ------ ------------------------------------
53 7 789577851 1 PAG 1:126 IX GRANT
53 7 789577851 1 KEY (010086470766) X GRANT
53 7 789577851 1 PAG 1:127 IX GRANT
53 7 789577851 2 KEY (090041892960) X GRANT
53 7 789577851 0 TAB IX GRANT
(1) id 789577851就是表Test,可以查詢sysobjects。
(2) 關於TAB的IX,是表結構的意向獨佔鎖定 。此時,如果你執行ALTER TABLE命令來改變表結構(會對錶結構上X鎖)是會被掛住 的。
(3) PAG是頁鎖,就是索引頁鎖,此時為什麼會有兩個呢?顯然1:126是索引樹的中間頁節點頁面,而1:127是分葉節點頁,也就是資料頁(叢集索引的表格儲存體結構)。因此,任何對索引頁上X鎖的操作都會被掛住,而上IX,S不會,SQL Server會進一步判斷行級鎖。此時,可以通過select * from Test with(paglock) where c2=2測試。
(4) KEY (010086470766) ,KEY (090041892960) 的兩個X最明顯了,就是行級獨佔鎖。一個是索引中間頁上的行級鎖,一個是分葉節點(資料頁)上的行級鎖。