Sql-Server
強制更新語句以相同的順序獲取頁面鎖?
我在同一張表上有兩個更新語句,它們以不同的順序獲取頁面鎖。這會導致死鎖。
- 程序 A 在第 1 頁擁有更新鎖,並在第 2 頁請求更新鎖。
- 程序 B 擁有第 2 頁的更新鎖,並希望獲得第 1 頁的更新鎖。
如何強制兩個語句以相同的順序獲取頁鎖?
如何強制兩個語句以相同的順序獲取頁鎖?
你不能。而是強制它們都使用帶有 TABLOCKX 提示的表鎖,或者使用應用程序鎖來序列化會話。
您可以在 SQL 語句中強制頁面訪問順序。您可能能夠為具有相同訪問順序的每個查詢找到一個計劃,然後應用計劃指南。IIRC 這只是一個建議,執行引擎可能不會在執行時使用它。
這些頁面被訪問和鎖定,因為這些頁面上的行被鎖定。如果您可以強制觸摸行的順序,也許是通過游標,那將解決這個問題。當然,您現在還有其他問題。
大概這兩個查詢沒有觸及相同的行。SQL Server 支持行鎖。您必須相應地定義表和索引。