2015-02-08 84 views
1

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

这甚至可能吗?

目前我做了以下内容:

  1. 本地数据库进行更新。
  2. 对Web服务执行更新。
  3. 如果Web服务调用成功提交数据库的本地更改。

但是如果在提交失败时会发生什么?

+0

外部服务是否也是WCF? – 2015-02-09 10:21:23

+0

是的外部服务也是WCF。 – 2015-02-09 12:58:15

回答

0

我假设通过外部网络服务您的意思是一种暴露在公共网络上的服务。

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

但是,如果这种方法是明智的,这是值得怀疑的,除非外部服务也是wsHttpBinding上的wcf。

如果外部服务不是wcf,那么整合可能会有相当大的痛苦;尽管WS-AT被设计用于互操作性,但在实践中,不同供应商如何解释协议几乎肯定会有变化,这可能导致客户端和服务实际上不可互操作。

但是如果在提交失败时会发生什么?

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

  1. 更新DB
  2. 呼叫服务
  3. 如果服务呼叫成功,提交DB
  4. 如果服务呼叫失败,不要犯DB

这样做的好处是,系统一致性可以在一个地方提供。但是,您的问题现在变成了如何判断通话是否成功。

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

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

+0

感谢您的信息:-)你有没有我如何使用WS-Atomic交易的例子? – 2015-02-09 12:58:56

+0

你是否在控制外部服务?你知道它已被配置为支持WS-AT吗?当你说*外部*服务,你的意思是它不在局域网上?跨公共网络? – 2015-02-09 13:14:46

+0

我问的原因是,如果您不需要到局域网以外的地方,有一个更简单的解决方案 – 2015-02-09 13:17:05