Sql-Server

UDPLOCK 是否使用行鎖?

  • May 19, 2014

我有一個在 DTCTransaction 內部UPDATE使用的語句UPDLOCK來避免死鎖。

現在我想知道。它是鎖定在行級別還是表級別?

現在我想知道它是鎖定在行級別還是表級別?

來自BOL

上鎖

指定在事務完成之前獲取並保持更新鎖。UPDLOCK 僅在行級或頁級為讀取操作獲取更新鎖。如果 UPDLOCK 與 TABLOCK 結合使用,或者由於某些其他原因而採用表級鎖,則將採用排他 (X) 鎖。

如果指定了 UPDLOCK,則忽略 READCOMMITTED 和 READCOMMITTEDLOCK 隔離級別提示。例如,如果會話的隔離級別設置為 SERIALIZABLE 並且查詢指定 (UPDLOCK, READCOMMITTED),則忽略 READCOMMITTED 提示並使用 SERIALIZABLE 隔離級別執行事務。

還可以看看Designing Transactions and Optimizing Locking

**WITH (UPDLOCK)**此提示在 DML 語句中使用,以使 SQL Server 獲取更新鎖而不是共享鎖。獲取的更新鎖將在事務的其餘部分保留。更新鎖與共享鎖兼容,但與其他更新鎖不兼容。因此,獲取更新鎖的 SELECT 語句將被阻塞,而只打算讀取數據而不是更改數據的 SELECT 語句是允許的。如果要先讀取數據並稍後更新數據,通常會指定 WITH (UPDLOCK)。因此,它可以被稱為“SELECT WITH INTENT TO UPDATE”。

引用自:https://dba.stackexchange.com/questions/65400