转载:http://www.griddss.cn/show.aspx?id=127&cid=7
因为这个问题讨论起来内容比较多一些,所以另开一个话题。
如果你只是要解决两个系统之间的事务同步问题,可以采用判断服务是否成功的办法来解决,即:
* A系统开始自己的事务,处理自己的数据,然后。。。
* 在提交之前调用B系统的服务。
* B系统开始自己的事务B,在事务中处理数据,再提交事务。
* B系统把自己事务的提交成功与否的信息做为返回值回馈A系统。
* A系统根据B的事务成功情况决定自己的事务是否提交或是回滚。
但是,在继续深入讨论这个问题之前,先反问一个引伸的问题:当分布式系统之间,要进行事务控制的子系统不是两个,而是N个时,如果进行事务控制?
分布式事务一直都是很难解决的问题。在面向DCOM的分布式应用中,有一种分布带事务支持策略,大体的思路是采用两段式事务提交的办法,第一次提交是预提交,预提交之后是可以回滚的。第二次提交是永久性的提交,提交之后就不可以回滚。并且,如果预提交成功,第二次提交也必然成功,系统必须可以保证这一点。
这样,当每个系统都支持这种两段式提交之后,就可以采用这样的事务管理:一个控制角色向每个分布系统提出执行要求,并要求完成第一次事务提交。当每个系统的第一次提交都成功时,则要求所有系统完成最后的永久提交,可知这次的永久提交是肯定可以完成的,因此不须要再担心这次提交是否成功。
如果第一次提交中,有某些应用出现失败,则要求所有的应用都回滚事务。
一些数据库软件本身就支持事务嵌套,如sqlserver等,不幸的是,我们的主力数据库informix不支持。
为了简化这种分布式事务管理,有一些中间件产品可以采用,用得比较广泛的是MS DTS.
你可能已经看出来了,这样的事务控制策略虽然可以在分布式环境下满足事务的ACID要求,但是它对各个分布组件是有要求的,在基于COM, remoting,JRMI一类技术的分布式应用程序中,这个没有问题。但是在采用web service的场景中,这是有问题的。
问题1. web service是一种以松耦合为指导思想的集成方式,一般情况下,主张采用无状态方法。
webservice主张两次调用之间没有上下文关系,即一次调用与其他之前和之后的调用都没有关系,一次提交即完成一次完整的处理。但是分布式事务却要求各方要在两次对话之间保持对话状态,以便于知道本次永久性提交时,要对之前“哪一个”已经被预提交成功的事务执行最后的提交。
当遇到这个问题时,我们必须要再多问自己一个问题:我们已经选择了正确的集成技术吗?如果多个系统之间有如此紧密的事务耦合关系时,我很怀疑它们其实就是同一个应用系统。同一个应用系统中,应该有相同的平台,相同的进程空间,相同的数据模型以及数据源。这种情况下,采用web service是一种错误的选择,web service应该用于不同平台、不同应用、不同的数据模型的系统集成。即便是的确需要在同一个应用系统中由于某些原因而实现模块间的分布式构造,也应该采用同一技术平台内的远过程访问技术,它们能通常比web service能提供更好的耦合性支持。
好吧,假设你经过思考之后,对上述问题的回答是“是”:我们确实必须要在异构的、多平台的、本来应该是低耦合系统之间实现分布式事务控制。那么,webservice还有用处吗?
谢天谢地,web service虽然主张交互之间采无状态方式,但是它并不是禁止采用有状态的交互。WEB SERVICE还是一种web技术,而web技术中的状态保存可能是最早被解决的问题之一了。在所有的web开发技术平台中,都有session机制,无论这些Session是通过IP,cookies, hidden input来实现,还是url sessionid来实现的,反正都有办法实现,请参阅所用平台的session支持机制就可以了。退一万步,你也可以通过在服务器中维护一个应用程序级的事务池来实现,未最后提交的事务对象都放在里面,每一个事务对象都给定一个唯一个的标志ID来识别,形成一个字典对象池。如果启动事务成功,则把此事务的ID返回给调用者执有,做第二段提交时,把事务的ID做为参数提交就是了。(随便提一下,用这种方法时,千万不能把对象的指针、句柄、引用什么的平台相关的值交给客户方,倒不是害怕安全问题,而是这些值在分布系统中是没有意义的,上次返回的指针没准早被垃圾收集机挪到其他地方去了)
无论如何,webservice在通信层上是一种无连接的协议,每两次调用之间,tcp连接是断开的,因此,一但采用session机制来管理上下文,你就必须为这些session的生命期负责。试想,如果一个事务上下文已经开启,而此时客户方系统却突然当机了,这时会出什么事情?在同一个应用程序域中,客户方的当机会让连接中断,服务器立即就会中断并回退事务,但是在webservice里,状态管理机无法立即感觉到此事务的调用方已经失去控制,只能在一定的时间之后,才发现:“噫?这个事务已经N长时间没有人访问了!快快回退!”在ASP.net里,默认的状态超时时长大概是20分钟,JSP也差不多,阻塞了20分钟的事务对数据源是什么影响可想而止!因此,必须考虑合适的状态时长与事务隔离级别,以减小对数据源的性能影响。
问题2. web service的“反模式”方法论使得无法在系统之间统一出共同的抽象接口。
web service是一种“反模式”的系统架构思想,即不是一般的由先建模并抽象接口开始,再由各个分布系统实现接口的系统构造方式,而是反过来:系统可能早已经完成,现在的问题是两个系统间的信息交互作用,因此交互的接口规格是根据需要,把系统数据模型去范式化后挑挑捡捡而定的。
因此,webservice中不支持接口抽象,即:你无法定义一个各个系统都必须实现的抽象事务接口,然后由各个系统实现这个接口的多态,最后在承担事务控制器的应用中调用统一事务接口以调度分布事务。虽然这样的接口模型在很多面向对象的开发平台中的远过程调用技术中所支持,但是如同之前说过的,web service是一种用于集成的松耦合的反模式方法论,而不是为紧耦合系统中的分布式对象而设计的。
所以,虽然有点讨人烦,但是我又一次忍不住想问我已经问过的那个问题:我们真得用对了技术吗?如果多个系统之间需要如此级别的接口耦合性,我真得越来越怀疑它们其实就是同一个应用系统了。
假设你的回答还是“是,他们真得不是同一个系统,他们是异构平台的,异构数据的!”好吧,那么继续。让我们采用web service来完成集成,但是你必须忘记你的OOP思想,老老实实地编码,用枯燥的、重复的代码把所有的系统的事务都控制在一起,别想用对象抽象的概念来省一点事。
真的吗?
如果把事务控制器独立出来如何?假设我们建立一个专用于分布式服务控制的应用,而用WEB SERVICE的方式公布接口, 允许其他应用程序通过向这个事务控制器注册自己的两段式事务开启、提交和回退的web service接口。然后,当有客户想启动分布事务时,就可以向这个事务控制器发起分布式事务请求,选择事务各方,启动一个分布式,最后向事务控制器,而非是各个事务方直接发起提交请求,这样事务控制的多态就可以在事务控制服务器中实现,虽然实现可能还是通过查表等方式实现,而非平台级的抽象方法,但是对于事务客户来讲,这样一个服务器就是多态的实现部分。
如果真得比MS更快更好地实现这样一个web service做接口,面向异构系统的分布式事务控制器,NASDAQ也许会有你的一席之地吧!
问题3. 异构平台不一定都支持两段事务提交模式。
web service面向的是完全异构平台的集成,那么显然不能指望每个平台都能支持两段时提交事务模式。但是,标准就是标准,协议就是协议,标准就是用来让大家遵守的,如果一个平台本来不支持两段式事务,那么为了能支持分布式事务,它就必须改造以实现两段式事务提交。
怎么改造是各个应用系统内部的事情,为了本文讨论的全整性,也在这里稍微涉及一下。
首选的方式是通过数据缓存的方式来实现。很多OO系统中,都采用了所谓的N层架构,即把业务对象与关系表模型分离开来,业务对象位于系统内存或是缓存中,由运行时的对象容器管理,容器根据一定的策略,把缓存中业务对象向数据库这样的久永介质中保存,或是从数据库中加载所需要的业务对象,在保存和加载过程中,将完成对象到表数据的转换,或是相反。
一般的N层结构的中间件产品中,都会提供两个级别的事务,即面向缓存中对象的事务控制和面向持久化过程的事务,可以考虑简单地将此两个事务级别对应的分布事务中的两段事务提交。但是,这种方式必须冒一定的风险,如对象容器级的事务成功,而数据库事务提交时出现失败,此时将会导致的数据不一致的风险,尽管这个几率并不很大。
在使用数据容器的情况下,也可以用保存对象的历史状态来实现事务的手工回退。因为在业务对象层与持久化层相分离之后,持久化层在数据更新时并没有复杂的逻辑,只是一些被罗列的、业务意义无关的数据更新序列。如果可以保持对象的状态历史,那么就可以在需要的时候将对象的状态恢复到旧的旧版上。实际上,在一些出色的中间件平台中,这个机制已经实现得非常完善了。(可以参阅Graphtalk平台的对象持久化管理,简直是天才!)
另一种笨办法是通过数据逻辑来实现两段事务提交,例如在要求第一次提交时,即真正提交,在第二次提交时固定什么也不做,而返回正常。如果要求回退,那么就通过数据逻辑或是业务逻辑来更新数据为旧状态。这种实现方式绝对是很令人头痛的。
不过,幸亏我们不是在为一个通用的数据库设计两段事务机制。要知道,面向服务的事务处理并不是如同数据库级别的事务那样,在事务的期间数据的操作有无穷的可能性。通常我们一个服务就是一个功能,其数据操作过程中,数据的变化方式是可预知的,因此恢复数据的状态也是一个个具体而固定的过程,只要我们针对每一个服务操作设计数据恢复机能就是了。
最后,如果这些都不可能实现的话——大于50%的可能性,因为时间、成本、技术等原因,这些都实现不了,那么只能靠两个字了:妥协。
- 浏览: 275897 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
qq642617822:
有用,谢谢了。
eclipse 导入jquery后报错 -
nbh219:
电脑配置问题?
MyEclipse+tomcat debug启动非常之慢 -
bngd032:
如此做了,还是不行的,我的myeclipse里没有断点 ...
MyEclipse+tomcat debug启动非常之慢 -
x9x9x9x9:
很管用呀
eclipse 导入jquery后报错
发表评论
-
maven 安装jar包命令
2017-03-11 10:43 881mvn install:install-file -Dfile ... -
aspose word 单元格加斜杠
2017-03-10 17:14 1378Document doc = new Document(); ... -
beans profile
2017-03-01 17:05 534http://www.cnblogs.com/pangguom ... -
一个action操作两个service,其中一个报错,如何保证事务的一致性?
2016-05-17 14:14 1755你可以把这两个操作写在一个Service中,一般一个Actio ... -
java 为什么只能单继承
2016-05-12 14:33 819从技术的角度来说,是为了降低复杂性。例如,A类中有一个m方法, ... -
java 递归
2015-12-23 16:13 558//菜单树形结构 public JSONArray tre ... -
bootstrap 验证是否通过
2015-11-27 17:57 742alert($('#formname').data('boot ... -
springMvc分页
2015-11-10 17:26 786@Override public Pagination&l ... -
jdbc 连接mysql
2015-10-13 13:45 598import java.sql.Connection; i ... -
java 定时任务
2015-07-31 19:54 605import java.util.TimerTask; ... -
java 判断为空
2015-07-31 18:44 658list.add(obj.getRegion()==null? ... -
js json里加数据
2015-03-21 09:28 556//记录答案 prop 属性,答案 function co ... -
查询多表返回一个list
2015-03-18 10:29 1088public List<?> getCourse ... -
判断多个参数
2015-03-12 17:09 510/** * @param obj 判断传入参数是否为空,如 ... -
xml 路径
2014-10-30 17:44 726三、如何获取XML文件全路径并读取配置参数 获取XML ... -
json嵌套 解析
2014-08-11 10:44 682JSONArray group = jsonObj.get ... -
java 读取txt和解析json
2014-08-06 16:20 1829File file = new File("e:\ ... -
读取properties配置文件里边的属性方法
2014-07-10 18:40 1094/** * */ package com.xcj ... -
求最大值和百分比
2014-07-09 19:20 753int[] num={4,3,1,7}; int ma ... -
springMVC 上传文件
2014-07-09 18:47 681<form action="<%=pa ...
相关推荐
### 激活Web Service步骤详解 #### 一、引言 随着企业信息化建设的深入发展,不同系统之间的数据交互需求日益增长。SAP作为全球领先的企业管理软件供应商,提供了强大的Web Service技术来实现与其他系统的无缝对接...
知识库通过Web Service与CAD系统实现信息集成,以Web Service技术为桥梁,进行知识传递和数据交换,支持分布式产品设计过程中对设计知识的共享。 综上所述,基于Web Service的知识库和CAD集成研究是一个涉及CAD技术...
### RESTful Web Service 课程知识点概述 #### 一、REST简介 REST(Representational State Transfer)是一种用于构建软件应用程序的设计风格或架构模式,它利用现有的网络标准和技术来创建灵活、可扩展的服务。...
# RESTful Web Service Primer ## 什么是REST? REST(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,基于客户端与服务器之间的交互模式。REST架构风格最初由Roy Fielding在其博士...
基于 REST 服务(RESTful Service)的 Web 应用系统设计任务主要包括:识别并设计 REST 风格的服务,采用面向服务的思想进行 REST 服务集成。采用这种方法设计的 Web 应用系统能够结合 REST 风格和面向服务思想的...
1. 使用URI作为事物的唯一标识。 2. 使用HTTP URI,以便可以通过HTTP请求获取这些标识。 3. 当URI被请求时,提供有用的信息,通常以RDF(资源描述框架)形式返回。 4. 在RDF信息中包含链接到其他URI的声明,以揭示...
SSH是一个常见的Java Web开发栈,用于构建高效、模块化且可维护的应用程序。下面我们将深入探讨SSH中的事务管理和配置。 首先,SSH中的每一个组件都有其在事务处理中的角色: 1. **Struts2**:作为MVC框架,主要...
SSM(Spring、SpringMVC、MyBatis)框架是Java Web开发中广泛使用的三大组件,结合了Spring的依赖注入、SpringMVC的Web层处理和MyBatis的数据访问层功能。在这个“idea 14 SSM 全注解框架+log4j+事物控制”的主题中...
本篇文章将详细探讨“注释事物控制”在Spring MVC与Hibernate集成环境下的应用。 首先,我们来了解Spring中的事务管理。Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理通过...
6. **与其它配置文件的关联**:`applicationContext-service.xml`通常与`applicationContext-dao.xml`(用于配置DAO层)、`applicationContext-web.xml`(用于配置Web层)等共同工作,形成完整的SSM应用配置。...
在集成这三个框架时,通常会创建一个Spring的配置文件,如`applicationContext.xml`,在这个文件中定义数据源、SessionFactory、事务管理器以及Service层bean。例如: ```xml <!-- 数据源配置 --> <!-- ...
- **WSDL (Web Service Description Language)**:一种XML格式的语言,用于描述Web Service的接口、消息格式、绑定方式等信息。 - **SOAP (Simple Object Access Protocol)**:一种轻量级的协议,用于在Web Service...
"事物管理javaweb.zip"这个文件很可能包含了关于在Java Web环境中如何管理和处理事务的相关资料。事务是数据库操作的基本单元,它规定了一组操作要么全部成功,要么全部回滚,以防止数据状态的不一致。 在Java Web...
在这个“springmvc+mybatis+mysql完整事物实例”中,我们将深入探讨如何在SpringMVC和MyBatis之间协同工作,以及如何在MySQL数据库中管理事务。 1. **SpringMVC**:SpringMVC的核心组件包括DispatcherServlet、...
最初开始接触web service的时候,所有的材料上来就是一大堆的名词,SOAP, WSDL,看得头都要大了,后来提出来的REST就容易理解得多,虽然目前SOAP在企业级的web service中还有一席之地,但是在公共的Internet上,不是...
通过配置数据库连接信息、数据源信息、多数据源及事物管理、持久层 DAO 的管理配置、Web.xml 中过滤器配置、DAO 实现类 EntityManager 注解修改、jdbc 数据源注解修改和 Service 实现类中事物注解修改,可以实现灵活...
推荐系统是信息过滤的一种方法,用于预测用户可能感兴趣的事物,如商品、音乐或电影。推荐系统的核心算法通常包括协同过滤、基于内容的推荐、混合推荐等。在【WebServiceRec】中,可能使用了Python的机器学习库,如...
- **资源**:资源是RESTful Web Service中的核心概念,可以是任何可被标识的事物,如一个用户、一篇文章或一条评论等。 - **URI**:Uniform Resource Identifier(统一资源标识符),用于唯一标识资源。 - **HTTP...
总结来说,SAP接口技术是实现SAP系统与其他系统集成的关键,包括基于RFC的底层通信、面向业务的BAPI、用于SAP间数据交换的ALE-IDoc,以及支持互联网服务的Web Service。这些接口技术的运用极大地扩展了SAP系统的功能...
围绕 Things API 的 REST Web 服务包装器 是一个 OSX/iOS 应用程序,用于以风格管理任务。 我主要用它来管理房子周围的重复任务。 事情不包括太多的 3rd 方集成方式,但是,它们确实有一个小的 。 我想要更多与事物...