WCF服务和本地数据库的原子事务

时间:2015-02-08 03:23:15

标签: wcf transactions

我想在一个原子事务中包装一个WCF外部Web服务调用和一个本地数据库调用(nhibernate)。

这甚至可能吗?

目前我正在做以下事情:

  1. 在本地数据库上执行更新。
  2. 执行网络服务更新。
  3. 如果Web服务调用成功,则提交对数据库的本地更改。
  4. 但如果提交失败会发生什么?

1 个答案:

答案 0 :(得分:0)

我假设外部网络服务你的意思是一种在公共网络上公开的服务。

如果外部服务支持WS-Atomic Transaction,那么可以将本地事务传播到服务。

然而,这种方法是否明智是值得怀疑的,除非外部服务也是wsHttpBinding的wcf。

如果外部服务是非wcf,那么整合可能会有相当大的痛苦;虽然WS-AT是为互操作性而设计的,但实际上几乎可以肯定的是,不同供应商如何解释协议,这可能导致客户端和服务实际上不可互操作。

  

但如果提交失败会怎样?

作为替代解决方案,我会考虑针对此问题的compensatory模式。举个例子:

  1. 更新数据库
  2. 致电服务
  3. 如果服务呼叫成功,则提交DB
  4. 如果服务呼叫失败,请不要提交DB
  5. 这里的好处是可以在一个地方提供系统一致性。但是,您的问题现在变成了如何判断呼叫是否成功。

    不幸的是,当您拨打服务电话时,呼叫总是可以返回失败但实际上是成功的。一个很好的例子就是服务超时。

    如果你打电话失败,你怎么知道?唯一的方法是对远程资源执行查找,以确定系统状态是否包含更新。