2010-05-11 17 views
2

我們正在嘗試解決死鎖問題。正在回滾的事務正嘗試在另一個事務具有獨佔(X)鎖的資源上發出更新(U)鎖。據聯機叢書(http://msdn.microsoft.com/en-us/library/ms175519.aspx),更新鎖應該防止死鎖,而不是導致它們。鎖問題 - 更新(U)鎖何時發佈?

所以,我的問題是,爲什麼/何時更新鎖應用於資源?我們對此有點困惑,因爲試圖讓更新鎖應用到will not的資源將被事務回滾的進程更新。

感謝您的幫助。

蘭迪

+0

什麼是與服務器進行的東西的事務隔離級別? – 2010-05-11 15:59:09

回答

0

還有的整個宇宙「假設」的背後是什麼原因導致死鎖(我的意思是,沒有辦法從你的初始後到底發生了什麼就告訴)。可能是表鎖,可能是索引鎖;可能是你不知道的交易;可能是表頭鎖,可能是tempdb問題(非常不可能),誰知道?

我曾經發現診斷死鎖的最好方法,就像這樣:

  • 火了SQL事件探查器,用「死鎖圖」並進行配置「鎖定:死鎖」事件,並且一定要包括TextData列
  • 當Profiler正在運行時,導致您的應用程序產生死鎖
  • 選擇「Deadlock Graph」分析器行,您將得到一個簡單而令人困惑的圖形顯示。這可能會幫助你弄清楚到底發生了什麼。
  • 如果這沒有幫助,該圖形由Profiler根據非常詳細的XML生成。提取此字符串(選擇Deadlock Graph行,Ctrl + C進行復制,粘貼您選擇的文本編輯器,並刪除除XML以外的所有列),然後查看XML(在您首選的XML編輯器中)。

到目前爲止,一旦我通過該XML獲得和工作,我一直能夠找出造成死鎖的原因。這是瞭解SQL內部部分可以得到的奇怪和複雜的好方法。

+0

它是通過SQL Profiler和它生成的死鎖圖形將我引入更新鎖。我只想知道爲什麼以及在什麼情況下更新鎖定發佈。 – 2010-05-11 16:22:34

+0

它是否嘗試更新表格的一行或多行內的一列或多列。 (請注意,即使您沒有更新,「UPDATE MyTable set colx = colx」也會發出鎖定。我不知道任何會產生更新鎖定的東西,但SQL確實包含了很多深奧的魔咒。 (有模式鎖定,但我假設你沒有得到這些。) – 2010-05-11 17:35:52

0

可能是沒有正確處理您的交易隔離,並且在序列化的交易模式。

你應該

  • 使用正確的事務隔離的連接上。

  • 有時在SQL上使用提示,如NoLock提示,當您基本上只是讀取一些數據,並且在事務中不用做任何事情。