在今天的文章里,我想向你展示下SQL Server里一個未公開的函數,還有你如何用那個函數來找出在哪頁記錄被存儲。
%%lockres%%今天我想向你展示的未公開函數叫做%%lockres%%,它與SQL Server的鎖實現有關。我們都知道,SQL Server實現鎖層級并在記錄層,頁層,表層請求鎖。當在記錄層鎖被請求,SQL Server不在記錄本身放置鎖——SQL Server生成一個哈希值(hash value),這個結果哈希值最后被鎖。為了計算這個哈希值,SQL Server使用未公開的%%lockres%%函數——你也可以自己調用。
當你在聚集表(有聚集索引定義的表)上調用這個函數,%%lockres%%返回你聚集鍵列的哈希值。
1 SELECT %%lockres%%, * FROM Person.Person
通過%%lockres%%的返回值幾乎沒有意思,因為它只是個哈希值。但它可以是很方便的,因為在sys.dm_tran_locks DMV里,你會知道resource_description列的哈希值。因為很容易找出在那條記錄上鎖被請求。
當你想在堆表上請求一個行層的鎖,沒有鍵值可以生成哈希值。在這個情況下,SQL Server在RID值上放置鎖——即所謂的行標識值(Row Identifier Value)。這個值8 bytes長有如下格式:文件號:頁號:槽號(FileID:PageID:Slot)。當你在堆表上調用%%lockres%%時,SQL Server會返回你這個RID值。
1 SELECT %%lockres%%, * FROM DatabaseLog
因此很容易在堆表上找到在哪個文件,哪個頁,哪個槽號記錄被存儲——很簡單,是不是?
感謝關注!
新聞熱點
疑難解答