2011-03-22 53 views
20

有時候,我得到這樣的異常不是很繁忙的SQL服務器上:SQL交易一度陷入僵局

Transaction (Process ID 57) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. 
Line number: 1 
Error Number: 1205 
Procedure: 
Server name: P01 
Error Source: .Net SqlClient Data Provider 
Error State: 47 

我無法重現它。我試圖同時運行來自不同客戶端的多個查詢,但沒有顯示出來。 當程序發生在內部觸發器內部時,處理這類問題的最佳方法是什麼?我的意思是,如何重新運行交易?

如何時異常中從觸發,這是所謂的一些程序作出插入調用過程時這樣做(即:procedure01 - >插入 - >觸發 - > procedure02!)

回答

32

我會建議你從兩個角度來解決問題。

  1. Trap or Catch死鎖錯誤這樣就可以重新運行被選爲由SQL Server數據庫引擎的死鎖犧牲品交易。

  2. 找出是什麼原因導致您的死鎖事件。 您可以通過以下兩種方式之一進行,無論是運行SQL Server Profiler跟蹤來捕捉和記錄死鎖事件,也可以使一些SQL Server Trace Flags將死鎖事件的詳細信息記錄到SQL Server錯誤日誌。

在案件絕大多數,您可以識別您的死鎖事件的原因,並通過在數據庫架構或任一個結構性變化的代碼參與/邏輯變化負責的亡羊補牢死鎖事件。

進一步的閱讀來看看:

我希望我已經回答了你的問題,但不要讓我知道如果我能幫助你進一步以任何方式。

+0

謝謝你約翰,你沒有回答我的問題。我需要在我的代碼中執行很多更改... – 2011-03-22 14:33:15

5

設置捕獲死鎖圖形事件的服務器端SQL跟蹤,以便您可以使用SQL Profiler查看.trc文件。通過這種方式,您可以擁有一些可以解決任何死鎖問題的方法。我已經提供了下面的代碼。您將必須根據需要更改文件路徑。將此腳本配置爲在SQL Server啓動時執行將是一個好主意。

僅供參考 - 許多不同的事情會導致死鎖,其中一個是缺少索引。

declare @rc int 
declare @TraceID int 
declare @maxfilesize bigint 
set @maxfilesize = 10 
declare @dtName nvarchar(50) 
select @dtName=(N'I:\Trace_Logs\DeadLockTrace'+ convert(nvarchar(8),getdate(),112)) 


-- Please replace the text InsertFileNameHere, with an appropriate 
-- filename prefixed by a path, e.g., c:\MyFolder\MyTrace. The .trc extension 
-- will be appended to the filename automatically. If you are writing from 
-- remote server to local drive, please use UNC path and make sure server has 
-- write access to your network share 

exec @rc = sp_trace_create @TraceID output, 2, @dtName, @maxfilesize, NULL ,365 

if (@rc != 0) goto error 

-- Client side File and Table cannot be scripted 

-- Set the events 
declare @on bit 
set @on = 1 
exec sp_trace_setevent @TraceID, 148, 11, @on 
exec sp_trace_setevent @TraceID, 148, 51, @on 
exec sp_trace_setevent @TraceID, 148, 4, @on 
exec sp_trace_setevent @TraceID, 148, 12, @on 
exec sp_trace_setevent @TraceID, 148, 14, @on 
exec sp_trace_setevent @TraceID, 148, 26, @on 
exec sp_trace_setevent @TraceID, 148, 60, @on 
exec sp_trace_setevent @TraceID, 148, 64, @on 
exec sp_trace_setevent @TraceID, 148, 1, @on 
exec sp_trace_setevent @TraceID, 148, 41, @on 
exec sp_trace_setevent @TraceID, 25, 7, @on 
exec sp_trace_setevent @TraceID, 25, 15, @on 
exec sp_trace_setevent @TraceID, 25, 55, @on 
exec sp_trace_setevent @TraceID, 25, 8, @on 
exec sp_trace_setevent @TraceID, 25, 32, @on 
exec sp_trace_setevent @TraceID, 25, 56, @on 
exec sp_trace_setevent @TraceID, 25, 64, @on 
exec sp_trace_setevent @TraceID, 25, 1, @on 
exec sp_trace_setevent @TraceID, 25, 9, @on 
exec sp_trace_setevent @TraceID, 25, 25, @on 
exec sp_trace_setevent @TraceID, 25, 41, @on 
exec sp_trace_setevent @TraceID, 25, 49, @on 
exec sp_trace_setevent @TraceID, 25, 57, @on 
exec sp_trace_setevent @TraceID, 25, 2, @on 
exec sp_trace_setevent @TraceID, 25, 10, @on 
exec sp_trace_setevent @TraceID, 25, 26, @on 
exec sp_trace_setevent @TraceID, 25, 58, @on 
exec sp_trace_setevent @TraceID, 25, 3, @on 
exec sp_trace_setevent @TraceID, 25, 11, @on 
exec sp_trace_setevent @TraceID, 25, 35, @on 
exec sp_trace_setevent @TraceID, 25, 51, @on 
exec sp_trace_setevent @TraceID, 25, 4, @on 
exec sp_trace_setevent @TraceID, 25, 12, @on 
exec sp_trace_setevent @TraceID, 25, 52, @on 
exec sp_trace_setevent @TraceID, 25, 60, @on 
exec sp_trace_setevent @TraceID, 25, 13, @on 
exec sp_trace_setevent @TraceID, 25, 6, @on 
exec sp_trace_setevent @TraceID, 25, 14, @on 
exec sp_trace_setevent @TraceID, 25, 22, @on 
exec sp_trace_setevent @TraceID, 59, 55, @on 
exec sp_trace_setevent @TraceID, 59, 32, @on 
exec sp_trace_setevent @TraceID, 59, 56, @on 
exec sp_trace_setevent @TraceID, 59, 64, @on 
exec sp_trace_setevent @TraceID, 59, 1, @on 
exec sp_trace_setevent @TraceID, 59, 21, @on 
exec sp_trace_setevent @TraceID, 59, 25, @on 
exec sp_trace_setevent @TraceID, 59, 41, @on 
exec sp_trace_setevent @TraceID, 59, 49, @on 
exec sp_trace_setevent @TraceID, 59, 57, @on 
exec sp_trace_setevent @TraceID, 59, 2, @on 
exec sp_trace_setevent @TraceID, 59, 14, @on 
exec sp_trace_setevent @TraceID, 59, 22, @on 
exec sp_trace_setevent @TraceID, 59, 26, @on 
exec sp_trace_setevent @TraceID, 59, 58, @on 
exec sp_trace_setevent @TraceID, 59, 3, @on 
exec sp_trace_setevent @TraceID, 59, 35, @on 
exec sp_trace_setevent @TraceID, 59, 51, @on 
exec sp_trace_setevent @TraceID, 59, 4, @on 
exec sp_trace_setevent @TraceID, 59, 12, @on 
exec sp_trace_setevent @TraceID, 59, 52, @on 
exec sp_trace_setevent @TraceID, 59, 60, @on 

-- Set the Filters 
declare @intfilter int 
declare @bigintfilter bigint 

-- Set the trace status to start 
exec sp_trace_setstatus @TraceID, 1 

-- display trace id for future references 
select [email protected] 
goto finish 

error: 
select [email protected] 

finish: 
go 
+0

在我的情況下,它缺少導致死鎖的索引。 – singhswat 2017-09-06 08:49:06

+0

我如何使用UNC路徑? – Drewdin 2018-03-02 15:36:19

1

我解決了喜歡使用ReadCommited隔離級別問題。