C# 事务操作的嵌套事务作用域

C# 事务操作的嵌套事务作用域,c#,.net,web-services,transactions,transactionscope,C#,.net,Web Services,Transactions,Transactionscope,我对transactionscope有点怀疑,因为我想做一个事务性操作,首先执行一些CRUD操作,一个在数据库中插入和更新一些行的事务,然后从整个事务中得到一个XML结果 在我得到XML后,我将XML发送到一个Web服务,我的客户公开该Web服务以与我的系统集成 关键是,让我们设想有一天,我的客户公开的WS由于其IT部门执行的每周或每月支持任务而出现故障,因此,每一次我都执行整个任务,它执行DB操作,但在我尝试调用WS时,它当然会抛出异常 在网上搜索之后,我开始思考交易范围。我的数据访问层上的数

我对transactionscope有点怀疑,因为我想做一个事务性操作,首先执行一些CRUD操作,一个在数据库中插入和更新一些行的事务,然后从整个事务中得到一个XML结果

在我得到XML后,我将XML发送到一个Web服务,我的客户公开该Web服务以与我的系统集成

关键是,让我们设想有一天,我的客户公开的WS由于其IT部门执行的每周或每月支持任务而出现故障,因此,每一次我都执行整个任务,它执行DB操作,但在我尝试调用WS时,它当然会抛出异常

在网上搜索之后,我开始思考交易范围。我的数据访问层上的数据访问方法已经有了一个TransactionScope,我可以在其中执行插入、更新、删除等操作

下面的代码是我想尝试的:

    public void ProcessSomething()
    {
        using (TransactionScope mainScope = new TransactionScope())
        {
            FooDAL dl = new FooDAL();

            string message = dl.ProcessTransaction();

            WSClientFoo client = new WSClientFoo();

            client.SendTransactionMessage(message);

            mainScope.Complete();

        }
    }

public class FooDAL
{
    public string ProcessTransaction()
    {
        using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions(){ IsolationLevel = IsolationLevel.ReadCommitted}))
        {
            ///Do Insert, Update, Delete and According to the Operation Generates a message

            scope.Complete();
        }

        return transactionMessage;
    }
}
问题是,使用TransactionScope处理我想做的事情是否正确

非常感谢您的时间:

TransactionScopeOption.Required在您的FooDAL中。ProcessTransaction方法实际上意味着:如果有可用的事务,请在此范围内重用它;否则,创建一个新的

简而言之:是的,这是正确的方法

但请注意,如果在FooDAL.ProcessTransaction中不调用scope.Complete,则对mainScope.Complete的调用将因“TransactionBortedException”或类似事件而崩溃,这很有意义:如果嵌套范围决定无法提交事务,则外部范围将无法提交它