【问题标题】:Transaction scope wcf and avoid unwanted Escalation to Distributed Transactions事务范围 wcf 并避免不必要的升级到分布式事务
【发布时间】:2023-03-10 05:14:02
【问题描述】:

我在 wcf 应用程序中遇到升级分布式事务的问题。

我的代码看起来像这样:

日志存储库

    public void AddLog(ImportLogDbo log)
    {
        using (DbManager dbManager = new DbManager("controlServerConnectionString"))
        {
            dbManager.SetSpCommand("dbo.ImportLog_Create",
                                   dbManager.Parameter("@ImportFile", log.ImportFile),
                                   dbManager.Parameter("@ImportError", log.ImportError),
                                   dbManager.Parameter("@ImportHash", log.ImportHash),
                                   dbManager.Parameter("@ImportCompleted", log.ImportCompleted))
             .ExecuteNonQuery();
        }
    }

日志服务

    public void AddImportLog(string ImportFile, string ImportHash)
    {
        ImportLogDbo importLogDbo = new ImportLogDbo
        {
            ImportCompleted = false,
            ImportFile = ImportFile,
            ImportHash = ImportHash                
        };


        if (_importLogRepository.GetByFileName(ImportFile) == null)
        {
            using (TransactionScope scope = new TransactionScope())
            {
                _importLogRepository.AddLog(importLogDbo);
                scope.Complete();
            }
        }

    }

项目在 .NET 4 中,我使用 Sql Server 2008R2

上面的代码调用我的wcf服务,配置是这样的

  <wsHttpBinding>
    <binding name="wsHttpBinding" transactionFlow="True" maxReceivedMessageSize="2147483647" closeTimeout="5:00:00" openTimeout="5:00:00" receiveTimeout="5:00:00" />          
  </wsHttpBinding>

<endpoint address="http://localhost:8080/AppServer/WsDocumentImportService" binding="wsHttpBinding" name="wsBinding" contract="ComDocs.AppServerServiceLibary.Abstract.IDocumentImportService"/>

我的问题在于事务范围,它总是以分布式方式进行推广。

我做错了什么? (我对wcf服务编程有点新意)

谢谢

【问题讨论】:

    标签: wcf transactions transactionscope mstdc


    【解决方案1】:

    transactionFlow = “true” 会将事务传播到服务边界之外。尝试将其设置为 false。您需要一个更细化的事务范围,您可以使用该属性对其进行设置。欲了解更多信息,请查看以下内容:

    http://msdn.microsoft.com/en-us/magazine/cc163432.aspx

    【讨论】:

    • 好吧,如果我理解,transactionFlow = "true" 对在客户端初始化的事务有好处吗? Btw transactionFlow 设置为 false 不起作用,仍然是同样的问题。
    • 一般来说,每个参与组件都应该管理自己的事务(如果没有特定的业务规则)。无论如何,在这种情况下,您不需要像 Repository.AddLog 那样传播事务不使用任何。在您的情况下,最好将存储库包装到事务范围中并在服务级别处理异常
    • 是的,这是一个有点错误的例子。但是在应用程序的其他地方,我使用在一个事务中调用两个存储库的方法提供服务......
    • 存储库应该管理事务,它应该被视为一个 UnitOfWork。在这种情况下,不要在 WCF 级别使用任何事务
    猜你喜欢
    • 2011-03-12
    • 1970-01-01
    • 2013-10-05
    • 2017-10-10
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多