0

ストアド プロシージャを呼び出してテーブルを更新/挿入すると、C# コードでデッド ロック例外が発生しConfigurationます。

ストアド プロシージャは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'
4

1 に答える 1

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 
于 2013-01-17T16:53:42.033 に答える