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

不可以。您可以回滚到保存点,请参阅异常处理和嵌套事务,但这与您想要的不同。

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

于 2012-08-23T07:15:39.320 回答
0

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

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

于 2012-08-23T07:15:26.947 回答
0

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

唯一可以帮助的是使用命名的保存交易

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

于 2012-08-23T07:16:33.477 回答