【问题标题】:WCF transaction over multiple services多个服务上的 WCF 事务
【发布时间】:2016-02-15 10:30:50
【问题描述】:

客户端应用程序在一个 TransactionScope 中调用 2 个不同的 WCF 服务,希望在其中一个调用失败时回滚整个事务:

using (var transaction = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{

     proxy1.UpdateThing(data);
     proxy2.UpdateSomeOtherThing(data);

     transaction.Complete();
}

现在,对 proxy1 的调用很好,但是对 proxy2 的调用会引发异常。 当我检查数据库时,对 proxy1 的调用仍然成功。

在这种情况下我应该如何去上班? DependentTransactions 是要走的路吗?

两个服务都托管在同一台机器上,都有一个 wsHttpBinding 且 TransactionFlow = true。该事务对每个服务都是孤立的,当调用同时使用这两个服务时,就像在示例中一样,它不起作用。 两种服务都使用正确的注释进行装饰。

异常只是其中一项服务的硬抛出,用于测试。

值得注意的是,这两个服务都使用 EF 将其数据处理到数据库中。

【问题讨论】:

  • proxy1 端点和/或操作是否能够处理事务?如果 proxy1 和 proxy2 的服务在你的控制之下,可以查看这篇文章来启用分布式事务:c-sharpcorner.com/UploadFile/81a718/…
  • 是的,接口上都有TransactionFlow,相关方法上都设置了TransactionScopeRequired。
  • 您使用什么绑定?一些绑定不支持事务。
  • wsHttpBinding。孤立地,事务行为适用于两种服务。只是当我开始跨越服务边界时,它并没有成功。
  • 这只是在代码中进行测试。

标签: c# wcf transactions transactionscope


【解决方案1】:

要在 WCF 中启用事务,您需要在您的使用者中作为事务范围进行更多操作。

要向 WCF 服务添加事务支持,您将执行以下操作:

  • 向服务合同添加事务支持。这是必需的。
  • 为实现服务的代码添加事务支持 合同。这是必需的。
  • 在 实现代码。这是可选的。
  • 在 捆绑。这是必需的。

要在客户端应用程序中启动事务,您必须执行以下操作:

  • 为代理类添加事务支持。
  • 在绑定上启用事务。
  • 使用 TransactionScope 类启动事务。

要了解如何实现这一点,您可以阅读(来源):Transactions in WCF Services

【讨论】:

  • 是的,就像 OP 中所述,事务行为单独适用于任一服务。就在我们跨越服务边界时,它开始分崩离析。
  • @Apeiron 这个方法解决了问题,你最后采取了什么方法?
猜你喜欢
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
相关资源
最近更新 更多