事务操作的嵌套事务范围

时间:2013-10-18 16:43:55

标签: c# .net web-services transactions transactionscope

我对transactioncope有疑问,因为我想做一个事务操作,首先我执行一些CRUD操作(一个插入和更新DataBase上的某些行的事务),我得到了整个事务的结果(XML)。

获得XML后,我将XML发送到我的客户公开的Web服务以集成我的系统。

关键是,让我们想象一下,有一天我的客户暴露的WS由于其IT区执行的每周或每月支持任务而崩溃,所以我每次执行整个事情它执行数据库操作但当然它在我尝试调用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处理我想要做的事情是否正确?

非常感谢您的时间:)

1 个答案:

答案 0 :(得分:0)

您的FooDAL.ProcessTransaction方法中的

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

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

但是请注意,如果你没有在FooDAL.ProcessTransaction中调用scope.Complete(),对mainScope.Complete()的调用将崩溃并出现'TransactionAbortedException'或类似的东西,这是有意义的:如果是嵌套的范围决定无法提交事务,外部范围不应该提交它。