これに相当する方法を実行するにはどうすればよいですか? My understanding is that this is impossible with TransactionScopesしかし、私はいくつかの他の方法で同等のものを達成したいと思います:.NET内のネストされたトランザクション
ビジネスロジッククラス:私はトランザクションのこの内部のすべての(おそらく統合テストをカプセル化するまで
public bool Bar()
{
try
{
using (var tsWork = new TransactionScope())
{
ComplicatedDataImportCode(somedata);
FlagRecordInDatabaseAsImported(); // this is the same record that's modified in the catch
tsWork.Complete();
return true;
}
catch (DuplicateDataException err)
{
// if we got here, the above transaction should have rolled back,
// so take that same record in the database and update it to "Duplicate".
FlagSameRecordInDatabaseAsDuplicate(err.Message);
}
return false;
}
さて、これは、正常に動作しますアサートを実行した後にロールバックしたい)。私のポイントを証明する
簡単なテスト:最終的には、Foo.Bar()
のコードはしかし、ソリューションに対応するために変更することができ
public void CanTest()
{
// Arrange
var foo = new Foo();
using (var ts = new TransactionScope())
{
// Act
var success = foo.Bar();
// Assert
if (success)
{
Assert.That(SomethingThatTestsThatTheDataWasImported);
}
else
{
Assert.That(SomethingThatTestsThatTheRecordWasMarkedAsDuplicate);
}
// Now that we have been able to perform our Asserts, rollback.
}
}
、ComplicatedDataImportCode()
のコードは、このソリューションのために変更され、そしてどのような私は本当に、その結果であることはできません失敗シナリオで正しくロールバックすることを確認する必要があります。
また、私はこの質問の冒頭で参照した記事によると、これを行うためにTransactionScopesを使用できないことを理解しています。ここではTransactionScopesを使用して、何をしたいのかを示し、この機能を実装するための最良の代替方法を探しています。
SQL Serverはネストされたトランザクションをサポートしています。最初の 'ROLLBACK'はすべてのレベルを強制終了します。 'COMMIT'は入れ子になっています。 – Kratz
ええと、SQL Serverがこれをサポートしていると誤解されているかもしれません。私はもっと学びたいです。あなたのリンクを読む。今のところ+1 ... – Jaxidian
@Kratz:あなたのコメントはまさに私の問題です。私は 'ROLLBACK'が全部ではなくその特定の"内部トランザクション "をロールバックするだけにします。 – Jaxidian