2013-06-26 89 views
2

有人可以向我解釋一個進程如何獲取頁面上的SIX鎖嗎?我死鎖圖xml文件我看到一個進程運行在RC隔離級別(在死鎖時執行select語句)在頁面上保留SIX鎖。瞭解SQL Server中的SIX鎖

這是什麼意思,以及如何獲得鎖? 從我得到的信息http://msdn.microsoft.com/en-us/library/aa213039%28v=sql.80%29.aspxSIX鎖保護S - 所有資源上的鎖和IX鎖定層次結構中較低的一些資源。

對於我的情況,這將是IX -locks行?可以將IX鎖定在一排嗎? (我覺得不是)。我很困惑。

另一件事是,我期望在幾行X -locks並沒有S -locks可言(因爲ILReadCommited)。如果我在前面的陳述中只插入了幾條記錄,爲什麼我要將整個頁面鎖定爲SIX

up!從DBA

回答

3

回答Sebastian Meine

要回答這個問題我得帶一點彎路,所以我承擔。 如果兩個會話對同一資源進行鎖定,SQL Server將檢查鎖定兼容性映射,如果第二個請求與第一個請求不是「兼容」,則第二個會話必須等待。有三種類型的鎖「S」,「U」和E「X」。 S鎖被用於從資源中讀取數據,X鎖被用於寫入資源。 S鎖相互兼容,X鎖與其他任何東西都不兼容。 U鎖是在某些情況下用於防止死鎖的混合。

現在,SQL Server可以鎖定幾個級別:表,分區,頁面和行。因此,如果會話一取得一個表鎖並且會話二在表的一行上取得一個不兼容的鎖,那麼這兩個鎖就不在相同的資源上,並且SQL Server不會檢測到衝突。爲了防止這種情況發生,SQL Server始終開始對錶級別鎖定並沿着層次結構進行操作。現在,頁面和行鎖定點的併發性較高,因此如果一個會話想要寫入一行而另一個會話想要寫入另一行,則它們不應該彼此阻塞。如果一個會話除了對一行進行鎖定,還必須對該表進行同樣的鎖定,那麼這個優勢就沒有了。因此,不是在表上取一個排它鎖(X),而是會話請求一個意向排他鎖(IX)。該鎖與其他打算鎖相兼容,但與其他「真正」鎖不兼容。因此,另一個會話也可以在同一個表上進行意向排他鎖定。意向排他鎖說,會話打算對較低級別的資源進行獨佔鎖定。如果預期的鎖是一個行鎖,同樣的情況發生在頁面級,所以完成之後,會話在表和其中一個頁上有一個IX鎖,並且在該頁中的一行上有一個X鎖。這也意味着,您將永遠不會在行中找到意向鎖,因爲行是鎖層級中的最低級別。

在某些情況下,會話在表或頁面上持有S鎖。如果會話現在(在同一個事務中)在同一個表中的一行上請求X鎖,那麼它首先必須在表/頁上採用IX鎖。但是,一個會話只能在任何給定資源上保持一個鎖。因此,要獲得IX鎖,它必須釋放可能不需要的S鎖,所以SQL Server提供了一個組合:SIX。

爲什麼你有一個頁鎖是由於SQL服務器有時決定,這將是更好的,而不是鎖鎖定的每一行的頁面的原因。如果在會話之間已經存在非常多的鎖,那麼通常會發生這種情況,但也可能有其他許多原因。

迄今爲止的理論。

現在你的情況SIX鎖由三代表舉行連接選擇查詢。除非明確地告訴它(例如用XLOCK提示),否則選擇從不會使用任何不是共享鎖的類型的鎖。這樣的提示在輸入緩衝區中是不可見的,所以我認爲IX部分是該連接上最後一批的剩餘部分。如果您正在使用連接池並忘記清除所有打開的事務,則此鎖可能永久存在。但它也很難排除故障。

你可以通過運行XEvent會話雙開反式提交和看看你是否能找到罪魁禍首這種方式啓動。


來源:https://dba.stackexchange.com/questions/45284/understanding-six-lock-in-microsoft-sql-server