TransactionScope and WCF callback
本文关键字:callback WCF and TransactionScope | 更新日期: 2023-09-27 18:17:32
我正在检查一段代码,遇到了以下内容:
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;
});
}
问题:
父事务隔离级别为"Snapshot",而内部数据库读取使用"ReadCommitted"。实际的事务隔离级别是什么?
假设有两个任务。任务1处理正常,并通过回调通道发送到WCF客户端。但是任务2引发了一个异常。我猜此时在父事务范围内执行的所有活动都应该回滚。但是我不确定回滚一组已经通过WCF回调通道发送到客户端的数据意味着什么。
1)这取决于,如果你是指嵌套的TransactionScope,那么根据MSDN,你不能用不同的隔离级别嵌套它们:
当使用嵌套的TransactionScope对象时,所有嵌套的作用域必须是如果需要,可配置为使用完全相同的隔离级别加入环境事务。如果是一个嵌套的TransactionScope对象尝试加入环境事务,但它指定了一个不同的隔离级别,抛出ArgumentException
但是,如果您正在使用一些存储过程,函数或只是运行原始SQL,您可以显式地更改隔离级别,并且它仍然为该连接设置,直到再次显式地更改。但请注意,它不会传播回TransactionScope对象。
2)这意味着通过资源管理器完成的所有更改都将被回滚。当然,如果您只是查询数据库并通过通道将结果传输回,则没有什么可回滚的,但是如果您更新数据库,那么在这种情况下应该回滚更改。
希望有帮助!