用于记录历史记录的数据库触发器似乎导致死锁异常?

时间:2013-01-17 16:46:50

标签: c# sql sql-server

当我调用存储过程更新/插入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 个答案:

答案 0 :(得分: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