.net 是否可以仅回滚用于自动测试的嵌套事务

.net 是否可以仅回滚用于自动测试的嵌套事务,.net,sql-server,unit-testing,transactionscope,.net,Sql Server,Unit Testing,Transactionscope,考虑以下代码: ExecuteSQL("UPDATE ..."); using (var t = new TransactionScope()) { ExecuteSQL("UPDATE ..."); if (SomeCondition) t.Commit(); else t.Rollback(); } var result = ExecuteSQL("SELECT ..."); 然后,我们使用外部TransactionScope编

考虑以下代码:

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();
}
当某个条件为false时,不可能为某个情况编写正确的测试。因为嵌套事务回滚回滚整个外部事务,包括第一条UPDATE语句


您知道任何解决方法吗?

SQL Server实际上不支持嵌套事务。它只有一个事务看到了多个
start transaction
语句,并且在真正提交之前需要多个
commit transaction
语句


作为一种解决方法,不要嵌套事务。可以在不同的连接上同时运行两个事务。

否。您可以回滚到一个保存点,请参阅,但这与您想要的不同


你真正想要达到的目标是什么?测试应在与生产类似的条件下进行。在内部事务中添加uber事务和测试方法与系统在生产中的行为完全不同。

未命名回滚将所有操作回滚到堆栈顶部

唯一有帮助的是使用命名的


警告:不适用于分布式事务。

是否有使用保存事务的TransactionScope包装程序?@alexey尝试将命令本身传递给服务器,而不使用任何wrappers@alexey ... 请注意,TransactionScope在默认情况下是可序列化的,并且非常适合分发传输(8-)