所谓RESTQ是Representational State TransferQ这个词汇的中文译很不l一Q而且很晦涩,有叫“兯状态传?#8221;Q有?#8220;表象化状态{?#8221;Q等{?/p>
REST风格的Web服务Q是通过一个简z清晰的URI来提供资源链接,客户端通过对URI发送HTTPh获得q些资源Q而获取和处理资源的过E让客户端应用的状态发生改变(不像那些q程q程调用那么直接地发生改变)?/p>
常用的对资源q行CRUDQCreate, Read, Update ?DeleteQ的四种HTTPҎ分别是POST, GET, PUT, DELETE?/p>
在chrome或者firefox览器都有很多插Ӟ我一般都是用chrome览器,在chrome的webstore中可以搜索到自己惌的插件。这里就讲讲Advance REST Client,Postman-REST Client,DEV HTTP CLIENT,Simple REST ClientQ火狐下?a style="color: #94c045; text-decoration: none;">RESTClient插g?/p>
|页开发者辅助程序来创徏和测试自定义HTTPh。它是一N常强大,使用单的客户端测试工P得到了程序员的好评。每周超q?0k的开发者用此应用E序。如此多的h是不会错的!
Postman可以帮助你更有效的针对API工作。Postman是一个scratch-your-own-itch目。它需要的是开发者有效的在项目中创徏APISQ能够对API试q行收藏保留?nbsp;
Simple REST Client插gQ提供了一个简单的表单q行各种HTTP操作Qƈ可以看到q回的信息。构定义HTTPh直接试您的|络服务?nbsp;
FirefoxRESTClient的插Ӟq款插g由国人开发,功能上支持Basic和OAuth的登录header发送,q且对于q回的XML数据q可以高亮显C?/p>
CURL是一个很强大的支持各U协议的文g传输工具Q用它来q行RESTful Web Services的测试简直是菜一?/p>
CURL的命令参数非常多Q一般用于RESTful Web Services试要用C面四U参敎ͼ
q是一个用Java写的试工P目主页上提到它有命令行和GUI两种版本。ؓ了方便操作我们选择GUI版本来看看。既然是一ƾYӞ昄比刚才介绍的浏览器插g功能更加强大。它支持应答正文的JSON和XML~排和高亮,q可以一键搭Z个RESTful服务端,另外q提供了单元试的功能?/p>
http://wenku.baidu.com/view/f3126425ccbff121dd3683b3.html
在现在的企业应用E序的开发中QWeb 服务已经来普遍。然而,从传l意义上来说Q它们还没有辑ֈ和所支持的服务相同的水^。当构徏 J2EE 应用E序Q特别是事务服务的时候,企业依赖于这些服务。本文概qC事务服务是如何在一个?Java Transaction API ?J2EE 环境中的 Web 服务事务的帮助下Q与 Web 服务实现无缝q接的?
本文要地概述了这Ҏ?Web 服务技术和已被证实的传l的事务技术,解释了它们是如何能够跨分布式?J2EE 环境甚至跨不同的事务体系l构来实C操作的?
本文假设您已l对事务服务的概念(例如QACID properties、提?回滚、事务划分,{等Q的理解辑ֈ中水^。要想了解事务服务的q一步信息,特别?JTSQ请参考文?Java theory and practiceQUnderstanding JTS —— An introduction to transactions。这文章可以在 developerWorks 上找刎ͼ请参?参考资?/font>Q。同P我也惌推荐一本关于事务的更全面信息的好书Q它是?Philip Bernstein ?Eric Newcomer 合著?Principles of Transaction ProcessingQ请参阅 参考资?/font>Q?
什么是 Java Transaction APIQJTAQ?
JTA 是事务服务的 J2EE 解决Ҏ。本质上Q它是描qC务接口(比如 UserTransaction
接口Q开发h员直接用该接口或者通过 J2EE 容器使用该接口来保业务逻辑能够可靠地运行)?J2EE 模型的一部分?
JTA h的三个主要的接口分别?UserTransaction
接口?TransactionManager
接口?Transaction
接口。这些接口共享公q事务操作Q例?commit()
?rollback()
Q?但是也包含特D的事务操作Q例?suspend()
Q?resume()
?enlist()
Q它们只出现在特定的接口上,以便在实C允许一定程度的讉K控制。例如, UserTransaction
能够执行事务划分和基本的事务操作Q?TransactionManager
能够执行上下文管理。本文仅仅需要您?JTA 有一个基本的了解?
JTA 是一个定义明的事务服务Q向 J2EE 应用E序开发h员提供一U可以直接用的服务。作为选择Q一个应用程序也可能q样部vQ容器将代替开发h员来理事务行ؓ。在后一U情况下Q开发h员能够全诏注于他们的应用程序的业务逻辑Q同时由 J2EE 容器来负责事务逻辑?
模型明确的事务服务的好处是对于每个单独的事务Ll持四个 ACID Ҏ。尽这是一个实现相关的问题QWebSphere Application Server 提供为每个导入的或者导出的事务保护q些 ACID Ҏ的能力Q而不ƈ发的事务数目是多?/p>
l历q所有的事务体系l构Q想要有效地一l事务传送给其他q不׃n同样模型的事务服务,同时保持原子的工作单元,是非常困隄。在我们的案例中Q徏模的 JTA q行?Java Transaction ServiceQJTSQ?之上QJTS 处理输入和输Z务传送的h?
因ؓ JTS 是一U由 CORBA 定义的对象事务服务(OTSQ的 Java 实现Q它只能够与另一?OTS 模型q接。因此, 一个事务只能传送给另一?OTS-兼容的目标,典型地即另一?J2EE 实现。因?JTA ?JTS 规范没有对这些接口的底层实现加以限制 Q只要它们符合模型)Q事务可以安全地在两?J2EE-兼容的应用程序服务器之间传送,而没有丢失它们的 ACID Ҏ的风险。然而,J2EE 服务器ƈ不必d理非 J2EE 调用?
某些 J2EE 服务器可能是例外Q例如,WebSphere Application Server 正地处理一个与 CORBA 兼容事务相关联的输入?CORBA hQ将q个事务传送给U程Q然后在它的上下文里执行事务工作。然而,在大多数情况下,当您试图在事务模型之间移动的时候,您不得不越 JTA ?JTSQ把目光投得更远Q在q里 Web 服务出现了?/p>
Web 服务是一U能够作为应用程序一部分部v在可讉K的服务器上供内部和外部客户用的对象。Web 服务由它?Web 服务描述语言QWSDLQ来描述。它定义了一个用基?XML 调用Q典型地使用 SOAP 协议Q的 Web 服务的输入和输出参数的用法。例如,客户端可以查看已l由服务器发布的 WSDLQ然后构造客L代码来调?Web 服务。一旦完成,它就能够通过?SOAP 消息传递给 Web 服务的一个方法来调用它。在q条 SOAP 消息中包括诸如方?名称的信息以及Q何它所需要的参数。返回值将在另一?SOAP 消息里被传送回来,再由客户提取出来?/p>
Web 服务由哪U语a~写而成q不重要Q因?WSDL 没有定义语言或者编E的模型相关的细节(例如QJava ?J2EE 技术)。这q?Web 服务的作者和客户端的作者选择他首选的解决Ҏ 的灵zL?
让我们来比较一?Web 服务?Enterprise JavaBeanQEJBQ组件。EJB lg要求 RMI-~译的代码,以便使客L能够讉KQ所?它能够像它的代理一样创造本地的存根QstubQ对象。因此,q将需要在每一ơ它们改变的时候,向所有的客户端重新分配存根(stubQ?无论如何Q和 Web 服务一h?WSDLQ所以客L能够构造它们自q客户端调用代码,在本地类路径上不需要服务器的类来执行调用。这个模型提供了一个非常y妙的Ҏ调用q程?EJBQ作?J2EE 模型的一部分Q必M?Java 客户来调用,最好是一?J2EE 理的客L。另一斚wQWeb 服务可以被Q何客L代码所调用Q这个代码能够构造一个结构良好的 SOAP h。因而,举例来说Q一个部|在 J2EE 服务 器上?Web 服务能够使用 C++ 客户来调用?/p>
因ؓ Web 服务hQ通过 HTTP ?SOAPQ的性质与其他的Ҏ调用Q例如,一个用通过 IIOP ?RMI ?EJB 调用Q差别很大,支持执行分布式事务的代码直到最q才可获得。这已经成ؓ?使用 Web 服务作ؓ分布式事务企业应用程序一部分Ӟ主要的问题。本质上QWeb 服务不能q行?Web 服务调用之前开始的事务上下?中,也不能将一个事务上下文传送给另一个组件?/p>
如果 Web 服务被用于工业,必须保它们在事务环?中运行的时候,以可靠的和可预知的方式工作。直到现在,Web 服务只能够用独立于其他lg的事?#8212;—?Web 服务的方法范围里划分?和服从它的底层的事务实现的规?#8212;—q且物理上不能离开 Web 服务或者进入另一?Web 服务。企业应用程序具有始l在企业lg间流?的事务。这需要成?Web 服务的标准来保它们能够被正地使用Q通过利用 Web 服务的功能仅仅忽略在我们的所有严格的企业应用 E序中依赖的和用的事务支持来避免改变您的编E风根{?/p>
解决Ҏ是一U称?Web 服务事务QWS-TransactionQ?的新技术。它能够调整事务的上下文。这个上下文可以?Web 服务、其他的诸如 EJB ?J2EE lg、甚臛_他支?WS-Transaction ??J2EE 事务服务使用?
WS-Transaction 是一个规范。它扩展?Web 服务协调QWS-CoordinationQ规范来定义一U支持原子事务的协调?/p>
WS-Coordination 是一个协调框架来使分布的参与?能够在他们个体行动之上就一个通用的结果达成协议?
本质上,q意味着分布式的参与者(例如Q在不同机器上的两个应用E序服务器)能够?WS-Coordination 把每个参与?的行为集在合一Pq一步地Qƈ且通过保它们完全同意对于在这个协调上下文里它们各自执行的所有行为均产生单一的结果,?q一步管理这些行为。否则,则不能以一个受控的方式来完成这些功能?
协调上下文可以被看作是一个标识符Q行为执行在q个标识W之下。作一比较Q这个概念非常类g事务上下文。当事务工作完成Q?在事务上下文里管理它Q当调用q个上下文去定或会滚时q个工作完成。协调上下文包含的附加信息是一个协调标识符、关于协调类型的 详细资料以及包括端口信息以便协调服务能够被访问的协调协议。在下面定义了这些术语?
协调服务Q或?协调器(CoordinatorQ?/em>Q?q一步由三个服务l成Q?ȀzL务(activation serviceQ?/em>?注册服务Qregistration serviceQ?/em>?协调协议Qcoordination protocolQ?/em> 服务。激zL务支?CreateCoodinationContext
操作来允许新的协调上下文存在。注册服务支?Register 操作来允许参与?在协调上下文中执行工作。协调协议服务支持协调协议的使用Q这个协议定义了协调器(CoordinatorQ和参与者之间的行ؓ和通信?
协调cd是一个协调行为的固定的集合,q个集合详细说明了协调协议的集合以及协调器(CoordinatorQ应该如何驱动完成?WS-Transaction 规范描述了两个协调类?#8212;— 原子事务QAtomic TransactionQ?/em>QATQ和 业务协定QBusiness AgreementQ?/em>QBAQ?q些协调cd中的每一个都包括协调协议。例如,原子事务QAtomic TransactionQ协调类型包括像 two-phase commit protocolQDurable2PCQ和 phaseZero protocolQVolatile2PCQ这L协调协议?您可以希望在支持原子事务的环境中使用q两个协议?
业务协定QBusiness AgreementQ协调类型提供了一U不同的功能cd。它被设计成用于更长的时帧。而不像原子事务,正常地您 与它联系一个非常短的生命期。业务协定协议(Business Agreement protocolQ的一个例子就是它自己Q被UC业务协定QBusiness AgreementQ?它是一个补偿协议?/p>
WS-Coordination ?WS-Transaction 之间是什么关p?
WS-Coordination 是基本的框架Q参与者之间活动的分布式结果成为可能。WS-Transaction 定义了协调类型,例如原子事务QAtomic TransactionQ,协调cd使用 WS-Coordination 框架来定义规则。在协调器(CoordinatorQ和参与者通信Ӟ它们必须遵@q些规则。两者之间的q个区别很重要?
两个应用E序和一个协调器QCoordinatorQ之间主要的协调程如下面的 ?1所C?
CoordinationContext
Q协调器?XML 消息Q来?App1 做出响应?/li>CoordinationContext
l协调器?/li>CoordinationContext
中找刎ͼ来注册用协调协议Y?/li>在一个现实世界的情况中,Web 服务可能是事务的和分布式的,协调器的发v者( App1Q将 CoordinationContext
传递给M它所期望的活动中的参与者( App2Q。这个上下文的接收者有两种选择Q它们可以用已l创建好了的协调器( CaQ,或者如果它们愿意,也可以在初始?CoordinationContext
中传递创建的新的协调器。然后,W二U选择新的协调器Q?CbQ?作ؓ App2的代理协调器。它包括与协调?Ca相同的活动标识符Q但是当 App2向它的协调器 Cb注册 Durable2PC 协议的时候,它的h直接传送给了协调器 Ca?cM圎ͼ在结束时Q准备和提交消息在最l到?App2Q它已经注册q?Durable2PC 协议Q之前将从协调器 Ca传递给协调?Cb?
请参?WS-Transaction 规范?4.1 ?AT3.1 Example Atomic Transaction Message FlowQ在那里您将看到一个应用程序和调解的协调器之间?WS-Coordination 程的非常好的示例(请参?参考资?/font>Q?
Web 服务事务Q原子事务(WS-AtomicTransactionQ?/a>
WS-AtomicTransaction 是一U对于原子事务的Ҏ的协调类型,它提供了一l协调协议。这些协调协议是Q?
当协调上下文创徏以后Q协调类型被指定Q但是协调协议直到注册时才被指定。Q何参与者可以注册Q意数目的协调协议Q应该发送和接收 由协议定义的恰当的消息。例如,如果一个参与者在协调器中注册?Durable2PC 协议Q当完成时一条准备消息将被发送给q个参与者,它们被认ؓ以与正常的事务资源相似的方式投票。想要了解这里每个协议的信息和它们的状态图Q请查阅 WS-Transaction 规范Q?W?4 ?AT3 Coordination protocolsQ请参阅 参考资?/font>Q?
如何能将 JTA 事务?WS-AtomicTransaction 一起用?
因ؓ JTA ?JTS 是实现相关的Q我用的q个CZ?WebSphere Application Server V5.0.2 ?WS-Transaction Tech Preview。这个场景将有两台机器,每个上都q行有应用程序服务器Q如 ?2 所C?应用E序服务器A部vq运行一?Bean Managed TransactionQBMTQEJB lg。应用程序服务器B部vq运行一?Web 服务?EJB lg通过使用 JTA 提供的接?UserTransaction
开始一个事务。它?XA-compliant database 执行事务工作Q步?1Q,然后使用 SOAP/HTTP 向在应用E序服务器B上的 Web 服务发送一个请求(步骤 2Q。Web 服务?XA-compliant database 执行工作Q步?3Q,然后q回?EJB lgQ步?4Q,由它再次使用 UserTransaction
接口来提交事务。所有由 EJB ?Web 服务Ҏ据库执行的事务都已经被包含在一个活动的范围里,q个zd是由协调器恰好在调用 Web 服务Q步?2Q之前创建的Q它已经被提交,同时保存着所有的 ACID Ҏ,它就好像是单一的工作单元?
让我们来看看下面的两个领?#8212;—J2EE 领域?Web 服务领域。在 J2EE 领域里,使用的事务模型是 JTA。在 Web 服务领域里, 使用的事务模型是 WS-AtomicTransaction。WebSphere Application Server 把一?Java Web 服务看作是一?J2EE 对象Q因此也?意味着QWeb 服务的实现属?J2EE 领域Q而调用属?Web 服务领域。在 WebSphere 领域Q正地驱动协议L正在被用的模型 QJTA 或?WS-AtomicTransactionQ的责Q?
?2 展示?在一个事务企业应用程序中包含 Web 服务是多么的ҎQ同时也展示了对于没有费一行代码麻烦就在导入的事务上下文中q行q个 Web 服务的用h_它又是多么的无缝?
h意:The EJB lg正运行在一个受理的环境中QEJB 容器Qƈ?Web 服务是符?JSR 109?/strong>
WS-Coordination 依靠它的ZXML的调用来 利用它本w是 Web 服务的优ѝ因为用来调?WS-Coordination 操作的协议是 SOAPQ消息内Ҏ XML 格式的纯文本。这意味着Q当使用 HTTP 传递给 Web 服务Ӟ不能仅仅通过 SOAP 包本w来定客户的详l资料,例如~程语言。因此,WS-AtomicTransaction 能够与M其他的用Q何支?WS-AtomicTransaction 的编E语a~码的事务服务相q接?
在近来的一个由 IBM ?Microsoft d?Web 服务演示上,展示?WS-AtomicTransaction 的这个跨事务服务和编E语a的互操作性??3 展示了一个示范这Ҏ术的场景?
??3 中有一?NET 服务器开始一个非 JTA 事务Q向两个 WebSphere 应用E序服务器和另外一?NET 服务器提Z Web 服务调用h。每个应用程序服务器都用它们的底层事务服务来执行事务工作。每ơ您能够使用 WS-Transaction 调用一个您{到的 Web 服务。当发v者完成事务,您?WS-Transaction 技术来协调每个参与者,保它们都已完成Q就好像它们是单一的工作单元似的?
在本文中Q您已经了解?WS-Coordination ?WS-Transaction 的基本概c到现在为止QWeb 服务q不能在分布式环境里使用事务。WS-Transaction 允许 Web 服务执行事务工作Q这个事务工作作为更q泛的活动生成组件、应用程序服务器、甚臛_现的一部分Q正如在 IBM ?Microsoft Web 服务演示中所展示的?
?WS-Transaction 的支持下Q我们能够可靠地使用 Web 服务作ؓ我们的企业应用程序的一部分Q因为它已经Z务支持嵌入到其他的企业组仉?/p>
?/span>WCF相关的事务协议有三个?/span>
q是个轻量的本C务协议,限制理在一?/span>AppDomain中的事务。不能跨AppDomain边界传播事务Q也不能跨服务边界传播事务。跟其他协议比,Lightweight protocol是最有效率的协议?/span>
q个协议可用于跨AppDomainQ进E和机器边界Q管理两阶段提交的事务协议。这个跨边界的事务协议?/span>RPCQ是二进制的Q?/span>windows专有的协议,不能I越防火墙,也不能用于与?/span>windowspȝ的互操作。在windows环境下的局域网Q?/span>OleTx协议是很好的分布式事务的理协议?/span>
WSAT?/span>OleTx协议cMQ也可以?/span>AppDomainQ进E和机器边界Q管理两阶段提交的事务协议。但WSAT不是微Y的专有协议,此协议是微Y?/span>IBM?/span>BEA{公司共同提出的工业标准。此协议也可用于Intranet中,但是更多的是用于?/span>Internet环境下,或者跟?/span>windowspȝq行互操作的分布式事务?/span>
说到WSAT协议q里有必要一下分布式事务的发展?/span>
分布式事务:
分布式事务在企业应用中是很重要的一个方面,微Y使用MSDTC作ؓ分布式事务管理器Q?/span>OleTx事务协议q行分布式事务管理,但是OleTx事务协议是微软的专有协议Q不是公认标准。在分布式环境中异构pȝ的交互一定要有个公认同意的分布式事务标准才能在异构的pȝ中实现分布式事务的协调?/span>
l OGM?/span>XA事务规范
1994q_开攄l(Open GroupQ的 X/Open 分布式事务流E(DTPQ模型,它定义了 应用E序如何使用 事务理E序跨多?/span> 资源理E序来协调分布式事务。如果事务是通过遵@ XA 的事务管理程序来q行协调的,则Q何遵?/span> XA 规范的资源管理程序都可以参与该事务,因此可以让不同厂商的事务品可以共同工作。所有遵?/span> XA 的事务都是分布式事务?/span>XA 既支持一步提交,也支持两阶段提交?/span>
对象理l(Object Management GroupQ的通用对象h代理体系l构对象事务服务Q?/span>Common Object Request Broker Architecture Object Transaction ServiceQ?/span> -- 定义遵@规范的流E如何跨多个程U程事务上下文从一个流E传播到另一个流E。这U传播得即使分布式对象q行于来自不同厂商的容器中,也可以在单个事务中合作?/span>CORBA OTS 规范建立?/span> XA 规范的基之上?/span>
l OASIS?/span>Business Transaction ProtocolQ?/span>BTPQ标?/span>
?/span> 2001 q_ 一个由各大公司Q包括惠普公司(Hewlett-PackardQ?/span>HPQ、甲骨文公司Q?/span>OracleQ及BEA公司Q组成的联盟开始着手创?/span> Organization for Advance Structured Information Systems (OASIS) Business Transaction ProtocolQ?/span>BTPQ标准?/span>
BTP 不是专门用于 Web 服务的事务处理协议,它的目的是它也能用于其他的环境中。因而,BTP 定义了事务性的 XML 协议Qƈ且必d规范中指定所有的服务依赖性?/span>
BTP协议相对比较复杂Qƈ且它把原子性事务和长时间运行的商业事务攑֜一赯行管理,q样它必解军_U各样不同的问题。它是通过放松限制来这样做的,q表面上lh感觉灉|度很高,但是很多东西ql实现者去实现了,D使用比较复杂?/span>
l OASIS?/span>WS-Transactions
?/span>BTP出现后,其他一些行业大公司Q包?/span> IBM?/span>Microsoft ?/span> BEAQ又发布了它们自q规范Q?/span> Web 服务事务处理Q?/span>WS-TransactionsQ,׃部分l成WS-CoordinationQ事务协调器Q?/span>WS-AtomicTransactionQ实现原子事务)?/span>WS-BusinessActivityQ实现长旉q行的商业事务)?/span>WS-Transactions?/span>BTP好的斚w是它事务协调器独立出来Q另外用两个标准?/span>WS-Transactions基础上分别实现原子事务和长时间运行的事务Q这L化了复杂性?/span>
WS-Transactions是专门用?/span>web services的事务规范?/span>
2005q_WS-Transactions发布了第一个版本,Version 1.0?/span>
2007q_WS-Transactions发布?/span>Version 1.1Qƈ?/span>OASISl织接受为标准,成ؓWS-*标准的一部分?/span>
WCF支持的可互操作的分布式事务协议只?/span>WS-TransactionsQƈ且只实现?/span>WS-Coordination?/span>WS-AtomicTransactionQ?/span>WS-BusinessActivity没被实现?/span>
WS-Coordination它描qC一个可扩展的交协议框Ӟ该框架对分布式的hq行其请求协议的判断与处理,处理后再请求向下方的业务处理模块进行分发?/span>
?框架最大特Ҏ其能够以pȝ程代理的n份来处理h。当不同的请求,无论是内部的同系l的h或外部的异构pȝ的请求,l过该框架处理后Q再其原有的?D的传输代理层上d了符合本pȝ信息规则的本地协议。也是本系l允许已l存在的事务、工作流或其他服务的h隐藏其自w独特的传输协议Qƈ可顺利运 行于异构式的pȝ环境中?/span>
当前WS-CoordinationE_的版本是1.1Q同hOASIS?/span>2007q发布的国际标准。现?/span>1.2版本也在赯q程之中?/span>WS-Coordination规范的具体实现需要开发中在基?/span>XML的配|文件中引入WS-Coordination规范的命名空_如指?/span><xsQ?/span>schema>字段的gؓws-addr.xsd。由于是ZXML文g来实玎ͼWS-Coordination规范易于实现Q且Ҏ后的扩展支持度高?/span>
通过WS-Coordination的用,一斚w通过附加l一的本地协议,在用不同通信协议的请求到来时Q进行统一的协议处理,加快了请求的处理速度Q提高了pȝ的松耦合性;另一斚wWS-Coordination规范所定义的框架加Zpȝ的异构性,使系l不因请求所使用的协议不同而无法处理,q提升了pȝ整体的兼Ҏ,加强了系l的l合服务能力?/span>
WS-AtomicTransaction 定义了一l特定的协议Q这l协议可以插?/span> WS-Coordination 模型Q以实现传统的两阶段原子事务处理协议。注意到原子的两阶段模型只是涉及的服务而言的非帔R要。提供服务的站点或基体系l构可能大肆宣传两阶D|交,但是却用一些其他的企业内部模型Q比如补偿模型或版本模型。这U自׃ɽ单的两阶D|交模型对于长期运行的 Internet 计算更有用?/span>
WCF实现?/span>WS-AtomicTransaction协议Q事务管理器是由MSDTC实现Q也是说在WCF中可以?/span>WS-AtomicTransaction协议q行分布式事务的理Qƈ跟其他实CWS-AtomicTransaction的异构分布式事务互操作?/span>
WS-BusinessActivity 定义了一l特定的协议Q这l协议可以插?/span> WS-Coordination 模型Q以实现长期q行的、基于补偿的事务处理协议?/span>
WS-BusinessActivity定义的是long-running事务Q所?/span>long-running事务是指那些企业业务程Q需要跨应用、跨企业来完成某个事务,甚至在事务流E中q需要有手工操作的参与,q类事务的完成时间可能以分计Q以时计,甚至可能以天计,q类事务也被UCؓSAGA?/span>
q类事务如果按照事务?/span>ACID的要求去设计Q势必造成pȝ的可用性大大的降低。试想一个由两台服务器一起参与的事务Q服务器A发v事务Q服务器B参与事务Q?/span>B的事务需要h工参与,所以处理时间可能很ѝ如果按?/span>ACID的原则,要保持事务的隔离性、一致性,服务?/span>A中发L事务中用到的事务资源将会被锁定Q不允许其他应用讉KC务过E中的中间结果,直到整个事务被提交或者回滚。这造成事务A中的资源被长旉锁定Q系l的可用性将不可接受?/span>
WS-BusinessActivity提供了一U基于补偿的long-running的事务处理模型。还是上面的例子Q服务器A的事务如果执行顺利,那么事务A先行提交,如果事务B也执行顺利,则事?/span>B也提交,整个事务q完成。但是如果事?/span>B执行p|Q事?/span>B本n回滚Q这时事?/span>A已经被提交,所以需要执行一个补偿操作,已l提交的事务A执行的操作作反操作,恢复到未执行前事?/span>A的状态。这LSAGA事务模型Q是牺牲了一定的隔离性和一致性的Q但是提高了long-running事务的可用性?/span>
目前?/span>WCF中未实现WS-BusinessActivityQ在WCF 4.0 beta2中也为实玎ͼ估计?/span>WCF 4.0正式版中也不会实?/span>WS-BusinessActivity协议?/span>
理事务必须有相应的协议外,q必L个事务管理器Q事务管理器通过相应的事务协议对本机的事务进行管理。如果同一个事务需要跨机器Q则每台参与事务的机器的事务理器之间进行相互协调共同完成一个分布式事务?/span>
d事务理?/span>Lightweight Transaction ManagerQ只能管理本C务,事务在一?/span>AppDomain内?/span>LTM使用Lightweight protocol理两阶D|交的事务?/span>LTM只能理单一的可持久化的资源Q如果有两个以上的可持久化资源登记到事务中,LTM被升?/span>DTC理器?/span>
Vista?/span>windows2008引入了内怺务管理器Kernel Transaction Manager (KTM)Q?/span>
Windows Vista中还引入了两个主要的事务资源Q事?/span>NTFS和事务注册表Q称作核心资?/span>kernel resource managers (KRM)Q?/span>KTM可以理q两c资源?/span>
事务?/span> NTFSQ也UCؓ TxFQ?/span>TxF可以文件操作纳入到事务理中,在事务中的的文g操作同事务中的其他事务资源一样在事务前后保持一致性?/span>
同样事务性注册表Q也UCTxRQ注册表的操作也可以U_C务管理中?/span>
KTM?/span>LTM一P使用Lightweight protocol理两阶D|交的事务Q只能管理本C务,事务在一?/span>AppDomain内,只能理单一的可持久化的资源?/span>
DTC可以理M跨越执行边界的事务,?/span>AppDomainQ跨q程Q跨机器Q跨服务?/span>DTC可以使用OleTx 或?/span>WSAT事务协议?/span>
DTC既可以管理本C务,更重要的是它能够理跨边界的服务?/span>
在?/span>WCF的场景下Q每台运?/span>WCF服务的机器都默认使用DTC?/span>DTC建立一个新事务Qƈ跨机器把事务传播到其他机器,发v事务的机器上的事务ؓ根事务,q个机器上的DTCp负责q个分布式事务的协调dQ负责启动事务,提交事务Q和回滚事务?/span>
事务理器可使用的事务协议:
Protocal |
LTM |
KTM |
DTC |
Lightweight protocol |
Yes |
Yes |
No |
OleTx protocol |
No |
No |
Yes |
WS-Atomic Transaction |
No |
No |
Yes |
在事务范围内Q可U_事务理的资源,卛_以在事务正常执行后提交生效,在事务失败可以回滚恢复到事务启动前状态的资源成ؓ事务资源。最常见的事务资源就是常用的数据库操作。但是在vista开始引入了两个核心事务资源Q?/span>TxF事务文g?/span>TxR事务注册表?/span>
可用的事务资源:
Sql 2005?/span>sql 2008的事务资源是?/span>sql serverQ?/span>LTM事务理器可以管理这cM务?/span>
Vista开始引入的TxF事务文g?/span>TxR事务注册表。可以对文g和注册表q行事务性操作?/span>KTM可以理q类资源?/span>
SQL Server 2000, Oracle, DB2, ?/span>MSMQq类资源是传l的事务资源Q这些资源只能由DTC事务理器进行管理?/span>
事务理器可理的事务资源:
Resource |
LTM |
KTM |
DTC |
?/span>Sql Server事务资源 |
Yes |
No |
Yes |
核心事务资源 |
No |
Yes |
Yes |
传统事务资源 |
No |
No |
Yes |
每个WCF中启动的事务都是先由LTM事务理器管理,一旦事务中出现现有事务理器无法管理的资源或情况,WCF会提升事务管理器的别。分别从LTM升?/span>KTMQ最高别升U到DTC。事务管理器可以多次升Q事务管理器一旦升U后不能降?/span>
事务理器的升规则Q?/span>