我想在一个原子事务中包装WCF外部Web服务调用和本地数据库调用(nhibernate)。WCF服务和本地数据库的原子事务
这甚至可能吗?
目前我做了以下内容:
- 本地数据库进行更新。
- 对Web服务执行更新。
- 如果Web服务调用成功提交数据库的本地更改。
但是如果在提交失败时会发生什么?
我想在一个原子事务中包装WCF外部Web服务调用和本地数据库调用(nhibernate)。WCF服务和本地数据库的原子事务
这甚至可能吗?
目前我做了以下内容:
但是如果在提交失败时会发生什么?
我假设通过外部网络服务您的意思是一种暴露在公共网络上的服务。
如果外部服务支持WS-Atomic Transaction,那么可以将本地事务传播到服务。
但是,如果这种方法是明智的,这是值得怀疑的,除非外部服务也是wsHttpBinding上的wcf。
如果外部服务不是wcf,那么整合可能会有相当大的痛苦;尽管WS-AT被设计用于互操作性,但在实践中,不同供应商如何解释协议几乎肯定会有变化,这可能导致客户端和服务实际上不可互操作。
但是如果在提交失败时会发生什么?
作为替代解决方案,我会考虑针对此问题的compensatory模式。举个例子:
这样做的好处是,系统一致性可以在一个地方提供。但是,您的问题现在变成了如何判断通话是否成功。
不幸的是,当您拨打服务电话时,呼叫始终可能会返回失败,但实际上可以成功。一个很好的例子就是服务超时。
你如何确实告诉你打电话是否失败?唯一的方法是对远程资源执行查找,以确定系统的状态是否包含更新。
感谢您的信息:-)你有没有我如何使用WS-Atomic交易的例子? – 2015-02-09 12:58:56
你是否在控制外部服务?你知道它已被配置为支持WS-AT吗?当你说*外部*服务,你的意思是它不在局域网上?跨公共网络? – 2015-02-09 13:14:46
我问的原因是,如果您不需要到局域网以外的地方,有一个更简单的解决方案 – 2015-02-09 13:17:05
外部服务是否也是WCF? – 2015-02-09 10:21:23
是的外部服务也是WCF。 – 2015-02-09 12:58:15