问:我们通过Web服务发布特定的接口。这些Web服务完成一单元的工作。在有些情况下,这些Web服务参与了在客户端发起的一个事务。问题是:客户端可以通过其他非Web服务的组件来实现回滚和更新,但他们不能通过Web服务实现(回滚和更新)。这些Web服务和客户端都是在.NET下实现的。我阅读了Web服务原子事务标准( WS-AtomicTransaction ),但找不到一个支持它的架构。
如果您也曾经面对这样的问题,可否介绍一下您的经验,并推荐一个支持该标准的架构?
答:你所要找的是Indigo,下一代的.NET。Indigo提供了一个面向服务的编程模型,该模型封装了管理事务的过程,所支持的事务包括:轻量级的不需要分布式协作的事务、启用分布式协作来支持交叉过程和分布式.NET组件的事务、需要Web服务原子事务的基于Web服务的事务。这些将在一个隐含的编程模型里实现,就像今天的.NET 1.1中的企业服务一样。一个直接的编程模型也将提供给用户,以使用户有更大的控制权。现在在.NET 2.0里面,已经有了一些相关的功能。例如,当多于一个的资源管理台参与一个事务的时候,一个轻量级的事务管理台将自动将事务提升为一个分布式协作的事务。
那么,现在你能做什么呢?在我看来,如果你要做一个你自己的对Web服务协作和Web服务原子事务协议的实现,将有很长的路要走。你最好还是等待,然后使用Indigo。此外需要提醒你的是,Web服务协作和Web服务原子事务标准还没得到广泛的认可。到目前为止,.NET和Java平台对这两个标准有一定支持。它们应该处理所有将Web服务嵌入到一个事务所需要的的状态管理和XML序列化等工作,而你能够在操作中插入一些隐含的事务属性。
同时我想提醒你在Java平台上,有一些供应商的平台包含了Web服务协作和Web服务原子事务标准的实现,它们是:
IBM WebSphere offer WS-AT for WAS
Choreology offers a Business Transaction Management (BTM) product called Cohesions
显然这不会对你的.NET服务不会有多大帮助,但至少说明已经有一些供应商开始支持这些标准,即使这些标准还没完全确立。