请考虑以下代码:
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语句。
你知道任何解决方法吗?
答案 0 :(得分:1)
没有。您可以回滚到保存点,请参阅Exception Handling and Nested Transactions,但这与您想要的不同。
你想要实现的目标是什么?测试应在类似的生产条件下进行。在内部事务中添加超级事务和测试方法与系统在生产中的行为完全不同。
答案 1 :(得分:0)
SQL Server并不真正支持嵌套事务。它只有一个事务已经看到多个start transaction
语句,并且在它真正提交之前需要多个commit transaction
语句。
作为解决方法,请勿嵌套事务。可以在不同的连接上同时运行两个事务。
答案 2 :(得分:0)