事务回滚和Web服务

15

给出一个从一个会话bean调用两个Web服务方法的示例,如果在调用两个方法之间抛出异常怎么办?如果不调用Web服务,则事务将回滚并且没有任何损失。但是,Web服务将不会回滚。当然,即使只有一个Web服务也存在问题。虽然这是一个通用的问题,但我对与EJB会话bean相关的解决方案感兴趣。

一种简单和自定义的解决方案是为每个“真实功能”方法添加一个特殊的“回滚方法”到Web服务中。我正在寻求的是一些标准化的方法来完成此操作。

3个回答

16

有许多技术正在发展,但问题仍然足够前沿,以至于标准化过程尚未为我们提供完全可移植的解决方案。

第一种选择是使 Web 服务具备事务感知能力。当然,这假设您对它们具有控制权,尽管在某些情况下编写一个非事务性服务的事务感知代理也是一种选择。

WS-AT 和 WS-BA 协议是事务 Web 服务的主要标准。不幸的是,它们仅指定协议,而没有语言绑定。换句话说,在编程语言级别上没有标准 API。对于 Java 来说,最接近的就是 JSR-156,但它还没有准备好。

然后问题变成了:如何将 EJB(即 JTA/XA)事务与 WS 事务绑定起来。由于 WS-AT 和 XA 协议使用的模型密切相关,因此可以通过协议桥实现。一些应用服务器提供了类似的功能。JBoss 在 JavaOne 上展示了他们的产品-请参见http://anonsvn.jboss.org/repos/labs/labs/jbosstm/workspace/jhalliday/txbridge/BOF-4182.odp

请注意,协议桥接技术也可以反向使用,以允许使用XA数据库后端的EJB作为事务性网络服务被公开。
然而,两阶段提交事务所使用的锁定模型实际上只适用于在同一控制域内的短暂事务。如果您的服务在同一家公司的数据中心运行,可能不会有太大问题。但对于更广泛的分布,无论是地理上还是管理上,您可能希望关注WS-BA,这是一个专门针对此类用途设计的Web服务事务协议。
WS-BA使用了一种基于补偿的模型,编程起来更加困难。它基本上是基于您提到的技术:通过调用补偿方法来撤销服务方法的效果。这可能有些棘手,但JBoss的一位实习生开发了一个非常不错的注解框架,可以让您以最小的努力定义补偿方法,并自动驱动它们。虽然它没有标准化,但如果您选择这种方法,非常值得一看:http://www.jboss.org/jbosstm/baframework

幸运的是我们使用JBoss,所以我倾向于您提出的解决方案,特别是最后一个链接。 - Andreas Tasoulas
大家好,这个回答现在已经五年了,它说“JSR-156还没有准备好”。有什么更新吗?现在是否有处理SOAP Web服务事务的标准?谢谢。 - jambriz

6

我知道微软、BEA Systems和IBM开发的Web Services-Coordination(WS-C)和Web Services-Transaction(WS-T)规范在一些情况下被使用。你可以从阅读IBM提供的Web服务事务Web服务事务协议比较文章开始来明确了解它们。


1
你提供的链接都已经失效了。这并不奇怪,因为你在8年前发布了它们 :) - Darcy

2
实际上,您通常不仅需要一个自定义回滚方法,还需要一个自定义提交方法。否则,您会遇到类似于WS-BA标准中发现的问题。
请查看http://www.atomikos.com/Publications/TryCancelConfirm以获得详细的文章。其中提到的功能在Atomikos ExtremeTransactions中可用......该产品还支持传统的“ACID”样式Web服务事务。
希望对您有所帮助。
Guy
免责声明:我为Atomikos工作

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接