使用 (TABLOCKX) 和同時使用 (TABLOCKX, HOLDLOCK) 提示有什么區別?似乎表被一個 TABLOCKX 獨占鎖定,直到事務提交,(TABLOCKX,HOLDLOCK)有什么好處?
例如,
BEGIN TRANSACTION SELECT TOP 1 * FROM Foo WITH (TABLOCKX)...
vs
BEGIN TRANSACTION SELECT TOP 1 * FROM Foo WITH (TABLOCKX, HOLDLOCK)...
uj5u.com熱心網友回復:
TABLOCKX 更改針對表采取的鎖定的記錄范圍和型別,將所有鎖定提升到表范圍并使它們獨占(即,不與其他會話共享)。
另一方面,HOLDLOCK 將當前隔離級別提升為 Serializable,有效地將鎖的時間范圍從“只要我在此事務中使用此表”更改為“直到此事務結束,即使我是不再使用它”。
所以 (TABLOCKX) 和 (TABLOCKX, HOLDLOCK) 之間的區別在于,來自 TABLOCKX 的 table-wide 排他鎖現在一直保持到事務結束,即使您的事務不再使用該表。如果沒有 HOLDLOCK,這些鎖只會在您實際使用該表時在事務中保持。
注意TABLOCK(X)正如檔案中的引述所示:
TABLOCK 指定在表級別應用獲取的鎖。獲取的鎖型別取決于正在執行的陳述句。例如,SELECT 陳述句可能會獲取共享鎖。通過指定 TABLOCK,共享鎖將應用于整個表,而不是在行或頁級別。如果還指定了 HOLDLOCK,則表鎖將一直保持到事務結束。
TABLOCKX 只是帶有排他鎖的 TABLOCK:
TABLOCKX 指定對表進行排他鎖。
顯然,我上面寫的不正確。根據@DavidBrowne-Microsoft 的說法,“ X 鎖和 U 鎖(至少在由于鎖提示而被使用時)始終保持到事務結束。 ”。這是令人困惑的,因為 Hints 上的檔案頁面從未明確表示(或否認)這一點(盡管可能有其他一些 MS 檔案頁面這樣做了)。
所以,有效(TABLOCKX)和(TABLOCKX,HOLDLOCK)做同樣的事情。我認為有些人這樣做是因為,像我一樣,他們對 Hints 上的檔案感到困惑。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/361958.html
標籤:sql sql-server 查询语句
