2

次のコードを検討してください。

ExecuteSQL("UPDATE ...");

using (var t = new TransactionScope())
{
    ExecuteSQL("UPDATE ...");

    if (SomeCondition)
        t.Commit();
    else
        t.Rollback();
}

var result = ExecuteSQL("SELECT ...");

次に、外側のTransactionScopeを使用して自動テストを作成し、各テスト後に変更をロールバックします。

[TestInitialize]
public override void Initialize()
{
    _transaction = new TransactionScope();
}

[TestCleanup]
public override void Cleanup()
{
    _transaction.Dispose();
}

SomeConditionfalseの場合、正しいテストを書くことはできません。ネストされたトランザクション ROLLBACK は、最初の UPDATE ステートメントを含む外部トランザクション全体をロールバックするためです。

回避策を知っていますか?

4

3 に答える 3

1

いいえ。セーブポイントにロールバックできます。例外処理とネストされたトランザクションを参照してください。しかし、それはあなたが望むものと同じではありません。

あなたが本当に達成しようとしていることは何ですか?テストは、本番環境と同様の条件下で行う必要があります。Uber トランザクションを追加し、内部トランザクションでメソッドをテストすることは、システムが本番環境でどのように動作するかとはまったく異なります。

于 2012-08-23T07:15:39.320 に答える
0

名前のないロールバックは、すべてのトランザクションをスタックの一番上にロールバックします。

助けることができる唯一のことは、名前付きのSAVE TRANSACTIONを使用することです

警告: 分散トランザクションでは機能しません。

于 2012-08-23T07:16:33.477 に答える
0

SQL Server は、ネストされたトランザクションを実際にはサポートしていません。複数のステートメントを確認したトランザクションが 1 つだけあり、実際にコミットする前にstart transaction複数のステートメントが必要です。commit transaction

回避策として、トランザクションをネストしないでください。異なる接続で同時に 2 つのトランザクションを実行することができます。

于 2012-08-23T07:15:26.947 に答える