2012-12-19 26 views
11

我目前具有在SQL Server 2008在此特定用戶表頻繁死鎖的麻煩是關於這個特定表的一些事實:如何有效地使用LOCK_ESCALATION在SQL Server 2008

  1. 有大量行(1〜2萬美元)
  2. 所有在此表上使用的索引只擁有「使用行鎖」在他們的選項打勾 編輯:只有一個上這是它的主鍵的表索引
  3. 行經常由多個事務更新,但是是唯一的(例如,大概一千或更多的更新語句每小時執行到不同的唯一行)
  4. 該表不使用分區。

在檢查上sys.tables表,我發現lock_escalation設置爲TABLE

我很誘惑,此表的lock_escalation轉向DISABLE,但我真的不知道有什麼副作用這會招致。從我的理解是什麼,使用DISABLE將減少從TABLE水平,這如果結合指數的行鎖的設置應該儘量減少在理論上我遇到僵局..

升級鎖從我在Determining threshold for lock escalation已經閱讀似乎鎖定當單筆交易獲得5000行時自動升級。

單一交易在這個意義上的含義是什麼?通過單獨的更新/選擇語句獲得5000行的單個會話/連接?

或者它是一個單一的SQL更新/選擇語句,獲取5000或更多的行?

任何見解表示讚賞,順便說一句,DBA的n00b這裏

由於當一份聲明中保存單個對象超過5000個鎖

+1

單一連接/事務,即** ** UPDATES(或插入)5000行或多個將導致鎖升級。是的 - 你*可以*關閉它 - 但我不認爲這將是一個非常好的主意 - 如果你禁用鎖定升級,你會**更多**壓力和工作到SQL Server鎖經理 - 雖然它*可能*防止表鎖,它會**顯着降低您的語句的性能**。畢竟:有一個很好的理由**爲什麼SQL Server在每個連接達到5000後升級鎖定...... –

+0

發佈[死鎖圖表](http://msdn.microsoft.com/en-us/ library/ms190465.aspx)(XML,而不是它的圖片!)。我建議將設置恢復爲默認值(啓用頁面鎖定)。不要玩凝固汽油。很可能你錯過了一些索引。 –

+0

我不認爲你的死鎖與表鎖相關。它們本質上是不同的概念。就像Remus說的,不要和Napalm一起玩,這裏有一個原因。然而就像我提到的僵局和表鎖是不同的概念一起。 – Namphibian

回答

8

鎖升級觸發。在同一個表的兩個不同索引上持有3000個鎖的語句不會觸發升級。

當鎖升級嘗試和對象上存在衝突的鎖,試圖中止,重試後另一個1250個鎖(保持,而不是收購),如果你的更新是在各行和你進行

所以在列上有一個支持索引,那麼鎖升級不是你的問題。

您將能夠使用Profiler中的Locks-> lock escalation事件來驗證此情況。

我建議你捕獲死鎖蹤跡以確定死鎖的實際原因。

+0

2012/11/22 16:04:28,spid8s,未知,等待圖 2012/11/22 16:04:28,spid8s,未知,遇到死鎖....打印死鎖信息 11/22/2012 16:04:23,spid27s,Unknown,waiter id = process1b8154988 2012/11/22 16:04:23,spid27s,Unknown,waiter-list 2012/11/22 16:04:23,spid27s,未知, owner id = process1c962b048 2012/11/22 16:04:23,spid27s,未知,擁有者id = process23a98b948 2012/11/22 16:04:23,spid27s,未知,擁有者id = process172ecfdc8 11/22/2012 16:04:23,spid27s,未知,擁有者id = process307993048 2012年11月22日16:04:23,spid27s,未知,擁有者id = process228b81288 – Avias

+0

管理幾周前獲取一些舊的跟蹤日誌職位),我到底在看什麼?老實說,我幾乎不知道我在看什麼 – Avias

+0

您將需要提供完整的死鎖跟蹤數據。您可以將其粘貼到pastebin並分享鏈接。 另請注意,您也許能夠通過使用http://www.sqlskills.com/blogs/paul/post/getting-historical-deadlock-info-using-extended-events中提到的腳本捕獲死鎖圖形.aspx –

0

我發現這篇文章後快速谷歌禁用表鎖升級。雖然對於OP來說不是一個真正的答案,但我認爲它仍然適用於一個腳本並且值得注意。有一個很好的小竅門,你可以暫時禁用表鎖升級。
打開另一個連接併發出類似的問題。如果一個不同的SPID當前持有 一個不兼容的表鎖不能發生

BEGIN TRAN 
SELECT * FROM mytable (UPDLOCK, HOLDLOCK) WHERE 1=0 
WAITFOR DELAY '1:00:00' 
COMMIT TRAN 

作爲

鎖升級。

microsoft kb