是否可以仅回滚嵌套事务以进行自动测试

时间:2012-08-23 07:09:12

标签: .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 编写一个自动测试,以在每次测试后回滚更改:

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

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

SomeCondition false 时,无法为案例编写正确的测试。因为嵌套事务ROLLBACK回滚整个外部事务,包括第一个UPDATE语句。

你知道任何解决方法吗?

3 个答案:

答案 0 :(得分:1)

没有。您可以回滚到保存点,请参阅Exception Handling and Nested Transactions,但这与您想要的不同。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

未命名的回滚将所有回复卷回到堆栈的顶部。

唯一可以帮助的是使用名为SAVE TRANSACTION

的内容

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