TransactionScope and WCF callback



我正在检查一段代码,遇到了以下内容:

 using(var transactionScope = new TransactionScope(TransactionScopeOption.Required, new TransactionScopeOptions { IsolationLevel = IsolationLevel.Snapshot })
    {
        List<Task> tasks = new List<Task>();
        try
        {
            // Perform some database operation to read data (These operations are happening with a transaction scope having scopeoption as "Required" and isolationlevel as "ReadCommitted")
           // Filter the data
           // At this point the code already has a reference to a WCF duplex callback
           // Create a List<Task> and a
           foreach(var data in List<SomeData>)
           {
               var task = Task.Factory.StartNew(() => {
                  **(WCF Duplex Callback Instance).Process(data);**
           });
           tasks.Add(task);
         }
       }
       catch(Exception ex)
       {
         // Log exception details
       }
       transactionScope.Complete();
    }
try
{
   Task.WaitAll(tasks);
}
catch(AggregateException ae)
{
    ae.Handle( ex => {
         // log exception details
         return true;
    });
}

问题:

  1. 父事务隔离级别为"Snapshot",而内部数据库读取使用"ReadCommitted"。实际的事务隔离级别是什么?

  2. 假设有两个任务。任务1处理正常,并通过回调通道发送到WCF客户端。但是任务2引发了一个异常。我猜此时在父事务范围内执行的所有活动都应该回滚。但是我不确定回滚一组已经通过WCF回调通道发送到客户端的数据意味着什么。

1)这取决于,如果你是指嵌套的TransactionScope,那么根据MSDN,你不能用不同的隔离级别嵌套它们:

当使用嵌套的TransactionScope对象时,所有嵌套的作用域必须是如果需要,可配置为使用完全相同的隔离级别加入环境事务。如果是一个嵌套的TransactionScope对象尝试加入环境事务,但它指定了一个不同的隔离级别,抛出ArgumentException

但是,如果您正在使用一些存储过程,函数或只是运行原始SQL,您可以显式地更改隔离级别,并且它仍然为该连接设置,直到再次显式地更改。但请注意,它不会传播回TransactionScope对象。

2)这意味着通过资源管理器完成的所有更改都将被回滚。当然,如果您只是查询数据库并通过通道将结果传输回,则没有什么可回滚的,但是如果您更新数据库,那么在这种情况下应该回滚更改。

希望有帮助!

最新更新