【问题标题】:Nested Transaction Scope for transactional Operation用于事务操作的嵌套事务范围
【发布时间】:2013-10-18 16:43:55
【问题描述】:

我对 transactionscope 有疑问,因为我想做一个事务操作,首先我执行一些 CRUD 操作(一个在数据库上插入和更新一些行的事务),我从整个事务中得到了一个结果(一个 XML)。

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

关键是,假设有一天我的客户暴露的 WS 由于其 IT 区域执行的每周或每月的支持任务而下降,所以我每时每刻执行整个事情它执行 DB 操作但当然它在我尝试调用 WS 时会抛出异常。

在网上搜索后,我开始想到 Transaction Scope。我的数据访问层上的数据访问方法已经有一个 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 来处理我想做的事情是否正确?

非常感谢您的宝贵时间:)

【问题讨论】:

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


    【解决方案1】:

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

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

    但请注意,如果您不在 FooDAL.ProcessTransaction 中调用 scope.Complete(),则对 mainScope.Complete() 的调用将因“TransactionAbortedException”或类似情况而崩溃,这是有道理的:如果嵌套作用域决定事务不能提交,外部作用域不应该能够提交它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多