【问题标题】:TransactionScope with async wcf service具有异步 wcf 服务的 TransactionScope
【发布时间】:2017-03-15 16:34:10
【问题描述】:

我无法让 transactionScope 回滚,要么是因为我遗漏了某些东西,要么是我误解了 transactionScope 的目的。

我有以下方法正在调用两个 wcf 服务:

    public async Task<IHttpActionResult> Put(IEnumerable<string> values)
    {
        using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
        {
            Task task1 = service1.UpdateAsync(values);

            Task task2 = service2.UpdateAsync(values);

            await Task.WhenAll(task1 , task2);

            scope.Complete();
        }

        return Ok();
    }

每个服务操作都有以下属性:

 [OperationContract]
 [TransactionFlow(TransactionFlowOption.Allowed)]
 void Update(IEnumerable<string> values);

实际服务(两者相同)

public void Update(IEnumerable<string> values)
{
    foreach (string value in values)
    {
        db1Access.Update(value);
    }
}

SqlAccess(这是我们正在使用的或我们自己的库,基本上是您在这背后的生计 IDbCommand 东西):

BaseSqlAccess sqlAccess = factory.CreateSqlAccess("stp_update");
sqlAccess.AddParameter("values", values);

sqlAccess.ExecuteNonQuery();

合约中的绑定具有以下属性:

<wsHttpBinding>
    <binding name="WSHttpCommonBinding" transactionFlow="true">
    </binding>
</wsHttpBinding>

实现服务端点的 API 配置:

<bindings>
  <wsHttpBinding>
    <binding name="CommonBindingConfiguration" transactionFlow="true" maxReceivedMessageSize="2000000"/>
  </wsHttpBinding>
</bindings>
<client>
  <endpoint address="http://localhost:56084/service2.svc" binding="wsHttpBinding" bindingConfiguration="CommonBindingConfiguration" contract="IService1" name="IService1EndPoint"/>
  <endpoint address="http://localhost:56084/service2.svc" binding="wsHttpBinding" bindingConfiguration="CommonBindingConfiguration" contract="IService2" name="IService2EndPoint"/>
</client>

如果我在 Task.WhenAll 之后抛出错误会开始回滚,我的印象是,我也尝试在 service2 中抛出错误,但 service1 仍然执行并且没有回滚。

我在这里错过了什么?

需要注意的几点:

  • DataAccess 正在执行 Procs
  • 每个服务都连接到两个单独的数据库

【问题讨论】:

  • 哎呀对不起我的坏事
  • 你能在服务器端显示实现端点的代码吗?这些方法也有相关的注释。还要在客户端显示绑定配置。
  • @ScottChamberlain 我已经在实现服务端点的 API 的配置数据中添加了

标签: c# wcf transactionscope


【解决方案1】:

我认为问题在于您没有归因将 TransactionScopeRequired 设置为 true 的 WCF 服务的实现。

[OperationBehavior(TransactionScopeRequired = true)]
public void Update(IEnumerable<string> values)
{
    foreach (string value in values)
    {
        db1Access.Update(value);
    }
}

更多关于herehere的信息。

【讨论】:

  • 这似乎从编码的角度纠正了它,看起来我在服务器本身上仍然存在一些 MSDTC 配置问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 2011-05-04
相关资源
最近更新 更多