次のコードを検討してください。
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();
}
SomeConditionがfalseの場合、正しいテストを書くことはできません。ネストされたトランザクション ROLLBACK は、最初の UPDATE ステートメントを含む外部トランザクション全体をロールバックするためです。
回避策を知っていますか?