Sql-Server

強制更新語句以相同的順序獲取頁面鎖?

  • April 7, 2020

我在同一張表上有兩個更新語句,它們以不同的順序獲取頁面鎖。這會導致死鎖。

  • 程序 A 在第 1 頁擁有更新鎖,並在第 2 頁請求更新鎖。
  • 程序 B 擁有第 2 頁的更新鎖,並希望獲得第 1 頁的更新鎖。

如何強制兩個語句以相同的順序獲取頁鎖?

如何強制兩個語句以相同的順序獲取頁鎖?

你不能。而是強制它們都使用帶有 TABLOCKX 提示的表鎖,或者使用應用程序鎖來序列化會話。

您可以在 SQL 語句中強制頁面訪問順序。您可能能夠為具有相同訪問順序的每個查詢找到一個計劃,然後應用計劃指南。IIRC 這只是一個建議,執行引擎可能不會在執行時使用它。

這些頁面被訪問和鎖定,因為這些頁面上的行被鎖定。如果您可以強制觸摸行的順序,也許是通過游標,那將解決這個問題。當然,您現在還有其他問題。

大概這兩個查詢沒有觸及相同的行。SQL Server 支持行鎖。您必須相應地定義表和索引。

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