[TestMethod]
public void NestedTSWithFailure()
{
// DataContext is a subclass of DbContext
DataContext context = new DataContext();
context.Database.Initialize(false);
using (TransactionScope scope1 = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted, Timeout = TimeSpan.FromMinutes(20) }))
{
for (int i = 0; i < 5; i++)
{
List<TrackAndTraceEvent> eventsForShipment = context.TrackAndTraceEvents.ToList();
try
{
using (TransactionScope scope2 = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted, Timeout = TimeSpan.FromMinutes(20) }))
{
// Do Something.
if (i == 2)
{
// Artificial error causing the scope to not complete
throw new Exception("");
}
scope2.Complete();
}
}
catch(Exception ex)
{
}
}
}
}
(TestMethod复制我遇到的问题)
所以在我的应用程序中,我已经嵌套了TransactionScopes,内部的那个继承了外部的事务。
现在当内部范围出错并且没有完成时会出现问题。它将Transaction本身置于Aborted状态,因此下次我尝试访问该事务(外部作用域)中的数据库时,会抛出上述错误:
System.Data.EntityException: The underlying provider failed on Open. ---> System.Transactions.TransactionException: The operation is not valid for the state of the transaction.
问题:有没有办法可以在不破坏交易的情况下回滚(或者只是不完整)内部范围?
这样做的目的是我有一个我需要测试的应用程序。我写了所以所有的测试都在TransactionScope中完成,因为我不想要任何提交,但是应用程序本身在的 try / catch 块中使用事务范围对于循环,所以当它进入 catch 块然后进入下一个 for 循环并尝试获取数据时会发生此错误。 它不是应用程序运行时的问题,因为每个作用域都有自己的事务,但在测试中,它会失败。