2013-01-17 60 views
0

當我調用存儲過程更新/插入到我的Configuration表中時,我在C#代碼中收到死鎖異常。正在用於記錄歷史記錄的數據庫觸發器似乎導致了死鎖異常?

SP_Update_Configuration存儲過程將插入新記錄或更新現有記錄。

觸發器設置爲保留歷史記錄表中以前記錄的歷史記錄。如果Configuration表具有更新或插入,則它應該將該記錄添加到Configuration_History表。

我認爲觸發器造成了死鎖?在添加觸發器之前,我沒有任何問題....任何想法?

我正在使用SQL Server 2012 Express。

這裏是我的SQL的一個例子:

CREATE PROCEDURE SP_Update_Configuration 
( 
--Input variables 
) 
AS 
BEGIN TRANSACTION 
DECLARE @RetCode INT 
DECLARE @RowCnt INT 
    --Standard Update Logic 
SELECT @RowCnt = @@ROWCOUNT 

IF @@ERROR <> 0 
    BEGIN 
    ROLLBACK TRAN 
    SET @RetCode = 5 
    RETURN @RetCode 
    END 

IF @RowCnt = 0 
    BEGIN 
     --Standard Insert Logic 
    END 

IF @@ERROR <> 0 
    BEGIN 
    ROLLBACK TRAN 
    SET @RetCode = 5 
    RETURN @RetCode 
    END 

COMMIT TRANSACTION 
GO 

create trigger dbo.Configuration_Log_Insert 
on dbo.Configuration 
    for insert 
as 
    set nocount on 
    insert into Configuration_History 
    select * 
     from Configuration 
go 

exec sp_settriggerorder @triggername = 'Configuration_Log_Insert', @order = 'last', @stmttype = 'insert' 

create trigger dbo.Configuration_Log_Update 
on dbo.Configuration 
    for update 
as 
    set nocount on 
    insert into Configuration_History 
    select * 
     from Configuration 
go 

exec sp_settriggerorder @triggername = 'Configuration_Log_Update', @order = 'last', @stmttype = 'update' 

回答

1
SELECT @RowCnt = @@ROWCOUNT 

IF @@ERROR <> 0 

在這裏你有麻煩,因爲@@ERROR

SELECT @RowCnt = @@ROWCOUNT 

錯誤代碼,你可以做到這一點是:

SELECT @RowCnt = @@ROWCOUNT, @error = @@ERROR 

IF @error <> 0 

在觸發器中你有

insert into Configuration_History 
    select * 
     from Configuration 

,但必須是

insert into Configuration_History 
    select * 
     from inserted 
+0

我會做出這些改變和測試,如果我仍然收到了僵局例外。我不知道@@錯誤問題,我一直在使用這些存儲過程,並且正在更新/正確插入。我不確定這是否是一個問題。 – Mausimo

+0

謝謝,這似乎彌補了例外。在我結束這個問題之前,我會進行更徹底的測試。乾杯! – Mausimo