在生產SQL Server 2000數據庫中,我們遇到了一些非常煩人的死鎖情況。SQL Server 2000死鎖
主要設置如下:
- SQL Server 2000企業版。
- 服務器使用ATL OLE數據庫以C++編碼。
- 通過存儲過程訪問所有數據庫對象。
- 所有UPDATE/INSERT存儲過程都將其內部操作包裝在BEGIN TRANS ... COMMIT TRANS塊中。
我收集與SQL事件探查繼互聯網就像this one上幾篇文章了一些初步的痕跡(忽略它指的是SQL Server 2005和的工具,同樣的原則也適用)。 從跟蹤看來,它是兩個UPDATE查詢之間的死鎖。
我們已經採取可能從作爲發生降低問題的可能性了一些措施:
- 選擇帶(NOLOCK)。我們更改了存儲過程中的所有SELECT查詢以使用WITH(NOLOCK)。我們理解具有髒讀取的含義,但被查詢的數據並不重要,因爲我們會進行大量自動刷新,並且在正常情況下,UI將具有正確的值。
- READ UNCOMMITTED。我們已將服務器代碼上的事務隔離級別更改爲READ UNCOMMITED。
- 交易範圍縮小。我們減少了交易的時間,以儘量減少發生數據庫死鎖的可能性。
我們也在質疑我們在大多數存儲過程(BEGIN TRANS ... COMMIT TRANS塊)內部有一個事務。在這種情況下,我猜測事務隔離級別是SERIALIZABLE,對嗎?那麼如果我們在調用存儲過程的源代碼中指定了事務隔離級別(如果我們也有),哪一個適用?
這是一個處理密集型應用程序,我們正在爲讀取(更大的百分比)和一些寫入命中數據庫。
如果這是一個SQL Server 2005數據庫,我可以用Geoff Dalgas answer on an deadlock issue concerning Stack Overflow,如果這甚至適用於我遇到的問題。但是,升級到SQL Server 2005目前還不是一個可行的選擇。我的問題是:你會怎麼走?您會採取哪些步驟來減少甚至避免發生死鎖,或者我應該使用哪些命令/工具來更好地揭示問題?
它看起來像只是影響了一些時間,巧合得到了減少相同死鎖的機會。 – 2009-11-27 20:31:43