我目前具有在SQL Server 2008在此特定用戶表頻繁死鎖的麻煩是關於這個特定表的一些事實:如何有效地使用LOCK_ESCALATION在SQL Server 2008
- 有大量行(1〜2萬美元)
- 所有在此表上使用的索引只擁有「使用行鎖」在他們的選項打勾 編輯:只有一個上這是它的主鍵的表索引
- 行經常由多個事務更新,但是是唯一的(例如,大概一千或更多的更新語句每小時執行到不同的唯一行)
- 該表不使用分區。
在檢查上sys.tables
表,我發現lock_escalation
設置爲TABLE
我很誘惑,此表的lock_escalation轉向DISABLE
,但我真的不知道有什麼副作用這會招致。從我的理解是什麼,使用DISABLE
將減少從TABLE
水平,這如果結合指數的行鎖的設置應該儘量減少在理論上我遇到僵局..
升級鎖從我在Determining threshold for lock escalation已經閱讀似乎鎖定當單筆交易獲得5000行時自動升級。
單一交易在這個意義上的含義是什麼?通過單獨的更新/選擇語句獲得5000行的單個會話/連接?
或者它是一個單一的SQL更新/選擇語句,獲取5000或更多的行?
任何見解表示讚賞,順便說一句,DBA的n00b這裏
由於當一份聲明中保存單個對象超過5000個鎖
單一連接/事務,即** ** UPDATES(或插入)5000行或多個將導致鎖升級。是的 - 你*可以*關閉它 - 但我不認爲這將是一個非常好的主意 - 如果你禁用鎖定升級,你會**更多**壓力和工作到SQL Server鎖經理 - 雖然它*可能*防止表鎖,它會**顯着降低您的語句的性能**。畢竟:有一個很好的理由**爲什麼SQL Server在每個連接達到5000後升級鎖定...... –
發佈[死鎖圖表](http://msdn.microsoft.com/en-us/ library/ms190465.aspx)(XML,而不是它的圖片!)。我建議將設置恢復爲默認值(啓用頁面鎖定)。不要玩凝固汽油。很可能你錯過了一些索引。 –
我不認爲你的死鎖與表鎖相關。它們本質上是不同的概念。就像Remus說的,不要和Napalm一起玩,這裏有一個原因。然而就像我提到的僵局和表鎖是不同的概念一起。 – Namphibian