2

コミットされていないTransactionScopeを使用するDatabaseTestFixtureクラスを使用して、SQL Server 2000データベースに対していくつかの単体テストを実行しているため、すべての変更がロールバックされます。テストはローカルデータベースに対して問題なく実行されました。

次に、単体テストを共通のデータベースサーバーに向け、単体テストを実行しているマシンにMSDTCをセットアップしました。すべて、そのマシンで問題ありません。

これで、同じ共通データベースに対しても単体テストを実行する新しいマシンをセットアップしました。このマシンでは単体テストが実行されないため、次のエラーが発生します。

System.Transactions.TransactionException:トランザクションはすでに暗黙的または明示的にコミットまたは中止されています。

MSDTCの設定は、機能している設定とまったく同じです。画面ごとに比較しました。

誰かが以前にこのようなことを経験したことがありますか?または、何が原因であるかについての手がかりを探す場所についての指針を得ましたか?

Windowsのバージョンとサービスパック、ファイアウォールオプション、msdtcオプション、VSバージョンとサービスパックを確認しました。

4

2 に答える 2

3

これは NUnit 2.5 に関連しているようです。それ以前は、次のコードは正常に機能していました。

[SetUp]
public void SetUp() {
    this._testDataContext = new DataContext();
    this._transactionScope = new TransactionScope();
}

[TearDown]
public void TearDown() {
    if (_transactionScope != null)
    {
        this._transactionScope.Dispose();
    }
    if (_testDataContext != null)
    {
        _testDataContext.Dispose();
    }
}

2.5 では、トランザクション スコープを でインスタンス化する必要がありTransactionScopeOption.RequiresNewます。正しく破棄されていないか、テストの実行中に NUnit でアンビエント トランザクションが実行されていると思われます。SetUp メソッドの 2 行目を次のように変更します。

this._transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew);

そしてそれは正しく動作するはずです。

誰かがなぜこれが起こるのかについてより良い説明を得ることができれば、私はそれを聞きたい.

于 2009-06-25T19:15:25.873 に答える
1

この問題は、使用しているNunitのバージョンに関連している可能性があります。ユニット2.5を実行したときにまったく同じ問題が発生しましたが、nunit 2.4.8または2.2でユニットテストを実行すると、問題は不思議なことに消えます。

これを試してみてください。私に知らせてください。そうすれば、私の小さなプロファイルポイントを増やすことができます。

よろしく

マック

于 2009-05-18T15:01:07.307 に答える