跨多个服务的 WCF 事务

本文关键字:WCF 事务 服务 | 更新日期: 2023-09-27 18:34:41

>客户端应用程序在一个事务作用域中调用 2 个不同的 WCF 服务,希望在其中一个调用失败时回滚整个事务,如下所示:

using (var transaction = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
     proxy1.UpdateThing(data);
     proxy2.UpdateSomeOtherThing(data);
     transaction.Complete();
}
现在,对

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

在这种情况下,我应该如何去上班?DependentTransactions是这里的方式吗?

这两个服务都托管在同一台计算机上,两者都有一个 wsHttpBinding with TransactionFlow = true。事务单独适用于每个服务,当调用同时使用两个服务时,如示例中所示,则不起作用。这两项服务都使用正确的注释进行装饰。

例外只是其中一个服务的硬抛出,用于测试这一点。

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

跨多个服务的 WCF 事务

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

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

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

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

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

若要了解如何实现这一点,可以阅读(源(:WCF 服务中的事务