1

トランザクション スコープ内で実行されるテストがあります。データベースの変更を避けるために、最後にトランザクション スコープを破棄します。

ほとんどの場合、これで問題なく動作します。

ただし、Entity Framework を使用して、ストアド プロシージャ内でコミットされるトランザクションを含むストアド プロシージャを実行する場合。次のエラーが表示されます。

"分散トランザクションが完了しました。このセッションを新しいトランザクションまたは NULL トランザクションに登録してください。\r\n"

トランザクション スコープとストアド プロシージャ内のトランザクションのコミットを組み合わせることは可能ですか?

4

2 に答える 2

6

この特定の問題を解決できる場合とできない場合がありますが、完全に回避することをお勧めします。これまで見てきたように、データベースが特定の状態にあることを保証するためにトランザクションに依存することは、常に機能するとは限りません。また、DB への複数の接続を使用しているため、実際に発生するすべてのトランザクションを分散トランザクションに自動的に昇格させました。これは微妙な違いかもしれませんが、テストの性質が変わります。分散トランザクションの特定の制限を克服するためにコードを書くことになるかもしれません。

とにかく、単体テストの場合は、データベースの代わりにメモリ内のモックまたは偽のオブジェクトを使用して、データベースの依存関係をモックアウトすることをお勧めします。私は LINQ to SQL で同様のことを行いました (この件に関する私のブログ エントリを参照してください)。物事をクリーンアップするために余分なトランザクションを導入するよりもテストしてください。そうすれば、クリーンアップ コードがテストで失敗しても、実行中の他のテストには影響しません。

于 2009-09-23T12:16:55.937 に答える
1

SP内で次のコードを使用して、トランザクションが現在有効であるかどうかに関係なくコンテキストを処理します:-

DECLARE @InTran int

Set @InTran = @@TRANCOUNT

IF @InTran = 0 BEGIN TRANSACTION

/* Stuff happens */

IF @InTran = 0 AND @@TRANCOUNT > 0 COMMIT TRANSACTION

@@TRANCOUNT が Transaction スコープからのトランザクションを反映しているかどうかはわかりませんが、試してみる価値はあります。

于 2009-09-23T12:04:15.517 に答える