これはかなり奇妙な状況に陥りました。私の状況にはいくつかの層があります。私はすべての層が厳密に必要とされているかどうかを識別しますが、ここで何が起こっているのかいなかった。SqlDataAdapterおよびアンビエントトランザクションで失われたテーブルをロックするトリガーのSQL Serverエラー
- C#のコードが
SqlConnection
が自動的に入隊しているにアンビエントトランザクションを作成しています。 - C#コードでは、
SqlDataAdapter
を使用してテーブルに行を挿入しています。 InsertCommand
はストアドプロシージャを参照しています。ストアドプロシージャは、簡単なINSERT
ステートメントです。INSERT
が実行されているテーブルには、トリガーがありますINSTEAD OF INSERT
。- トリガーは、テーブルに対して排他ロックを取得します。
- トリガー内でエラーが発生しました。
この組み合わせでは、C#コード内でエラーは発生しません。ただし、トリガーがでない場合、はテーブルに排他ロックを取得しますが、エラーはC#コードまで行います。
エラーは実際にはですが、SQL Server側ではトランザクションが中断されていることがわかります。 C#コードは、トランザクションが中止されたことを知らず、TransactionScope
の処分がCOMMIT TRANSACTION
になるとエラーに遭遇するだけです。
私は、このシナリオの最小限の再現作成しました:誰もが、これはあるかもしれない、とどのように適切なエラーの挙動を扱うが復元されるかもしれない理由のいずれかの理解を持っています
https://github.com/logiclrd/TestErrorWhileLockedInTrigger
を?
これを見て、「Database Initialization.sql」とコードの不一致によって混乱した人は、それは私の悪いことです。 gitを追加してコミットする前に 'Save'を押すのを忘れました。私は正しい初期化コードでフォローアップコミットを行った。 –