web service中的事务控制
因为这个问题讨论起来内容比较多一些,所以另开一个话题。
如果你只是要解决两个系统之间的事务同步问题,可以采用判断服务是否成功的办法来解决,即:
* 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%的可能性,因为时间、成本、技术等原因,这些都实现不了,那么只能靠两个字了:妥协。
分享到:
相关推荐
1、文件内容:ibus-table-chinese-erbi-1.4.6-3.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/ibus-table-chinese-erbi-1.4.6-3.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
选择Java后台技术和MySQL数据库,在前台界面为提升用户体验,使用Jquery、Ajax、CSS等技术进行布局。 系统包括两类用户:学生、管理员。 学生用户只要实现了前台信息的查看,打开首页,查看网站介绍、自习室信息、在线留言、轮播图信息公告等,通过点击首页的菜单跳转到对应的功能页面菜单,包括网站首页、自习室信息、注册登录、个人中心、后台登录。 学生用户通过账户账号登录,登录后具有所有的操作权限,如果没有登录,不能在线预约。学生用户退出系统将注销个人的登录信息。 管理员通过后台的登录页面,选择管理员权限后进行登录,管理员的权限包括轮播公告管理、老师学生信息管理和信息审核管理,管理员管理后点击退出,注销登录信息。 管理员用户具有在线交流的管理,自习室信息管理、自习室预约管理。 在线交流是对前台用户留言内容进行管理,删除留言信息,查看留言信息。
面向基层就业个性化大学生服务平台(源码+数据库+论文+ppt)java开发springboot框架javaweb,可做计算机毕业设计或课程设计 【功能需求】 面向基层就业个性化大学生服务平台(源码+数据库+论文+ppt)java开发springboot框架javaweb,可做计算机毕业设计或课程设计 面向基层就业个性化大学生服务平台中的管理员角色主要负责了如下功能操作。 (1)职业分类管理功能需求:对职业进行划分分类管理等。 (2)用户管理功能需求:对用户信息进行维护管理等。 (3)职业信息管理功能需求:对职业信息进行发布等。 (4)问卷信息管理功能需求:可以发布学生的问卷调查操作。 (5)个性化测试管理功能需求:可以发布个性化测试试题。 (6)试题管理功能需求:对测试试题进行增删改查操作。 (7)社区交流管理功能需求:对用户的交流论坛信息进行维护管理。 面向基层就业个性化大学生服务平台中的用户角色主要负责了如下功能操作。 (1)注册登录功能需求:没有账号的用户,可以输入账号,密码,昵称,邮箱等信息进行注册操作,注册后可以输入账号和密码进行登录。 (2)职业信息功能需求:用户可以对职业信息进行查看。 (3)问卷信息功能需求:可以在线进行问卷调查答卷操作。 (4)社区交流功能需求:可以在线进行社区交流。 (5)个性化测试功能需求:可以在线进行个性化测试。 (6)公告资讯功能需求:可以查看浏览系统发布的公告资讯信息。 【环境需要】 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.数据库:MySql 5.7/8.0等版本均可; 【购买须知】 本源码项目经过严格的调试,项目已确保无误,可直接用于课程实训或毕业设计提交。里面都有配套的运行环境软件,讲解视频,部署视频教程,一应俱全,可以自己按照教程导入运行。附有论文参考,使学习者能够快速掌握系统设计和实现的核心技术。
三菱Fx3u程序:自动检测包装机电机控制模板,PLC脉冲与伺服定位,手自动切换功能,三菱Fx3u程序:自动检测包装机电机控制模板——涵盖伺服定位与手自动切换功能,三菱Fx3u程序,自动检测包装机。 该程序六个电机,plc本体脉冲控制3个轴,3个1pg控制。 程序内包括伺服定位,手自动切,功能快的使用,可作为模板程序,很适合新手。 ,三菱Fx3u程序; 自动检测包装机; 六个电机; PLC脉冲控制; 伺服定位; 手自动切换; 功能快捷键; 模板程序。,三菱Fx3u PLC控制下的自动包装机程序:六电机伺服定位与手自动切换模板程序
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
计及信息间隙决策与多能转换的综合能源系统优化调度模型:实现碳经济最大化与源荷不确定性考量,基于信息间隙决策与多能转换的综合能源系统优化调度模型:源荷不确定性下的高效碳经济调度策略,计及信息间隙决策及多能转的综合能源系统优化调度 本代码构建了含风电、光伏、光热发电系统、燃气轮机、燃气锅炉、电锅炉、储气、储电、储碳、碳捕集装置的综合能源系统优化调度模型,并考虑P2G装置与碳捕集装置联合运行,从而实现碳经济的最大化,最重要的是本文引入了信息间隙决策理论考虑了源荷的不确定性(本代码的重点)与店铺的47代码形成鲜明的对比,注意擦亮眼睛,认准原创,该代码非常适合修改创新,,提供相关的模型资料 ,计及信息间隙决策; 综合能源系统; 优化调度; 多能转换; 碳经济最大化; 风电; 光伏; 燃气轮机; 储气; 储电; 储碳; 碳捕集装置; P2G装置联合运行; 模型资料,综合能源系统优化调度模型:基于信息间隙决策和多能转换的原创方案
IPG QCW激光模块电源驱动电路设计与实现:包含安全回路、紧急放电回路及光纤互锁功能的多版本原理图解析,IPG QCW激光模块电源驱动电路设计与实现:含安全回路、紧急放电及光纤互锁等多重保护功能的原理图解析,IPG QCW激光模块电源驱动电路, 包含安全回路,紧急放电回路,光纤互锁回路等, 元件参数请根据实际设计适当调整,此电路仅供参考,不提供pcb文件 原理图提供PDF和KICAD两个版本。 ,IPG激光模块; QCW激光电源驱动; 安全回路; 紧急放电回路; 光纤互锁回路; 原理图PDF和KICAD版本。,IPG激光模块电源驱动电路图解:含安全与紧急放电回路
基于LSSVM的短期电力负荷预测模型及其性能评估:结果揭露精确度与误差分析,LSSVM在短期电力负荷预测中的结果分析:基于均方根误差、平均绝对误差及平均相对百分误差的评估。,LSSVM最小二乘支持向量机做短期电力负荷预测。 结果分析 均方根误差(RMSE):0.79172 平均绝对误差(MAE):0.4871 平均相对百分误差(MAPE):13.079% ,LSSVM(最小二乘支持向量机);短期电力负荷预测;均方根误差(RMSE);平均绝对误差(MAE);平均相对百分误差(MAPE),LSSVM在电力负荷短期预测中的应用及性能分析
1、文件内容:libmtp-examples-1.1.14-1.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/libmtp-examples-1.1.14-1.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
资源内项目源码是均来自个人的课程设计、毕业设计或者具体项目,代码都测试ok,都是运行成功后才上传资源,答辩评审绝对信服的,拿来就能用。放心下载使用!源码、说明、论文、数据集一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 4、如有侵权请私信博主,感谢支持
2023-04-06-项目笔记-第四百一十六阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.414局变量的作用域_414- 2025-02-21
MINIST数据集和春风机器学习框架
1、文件内容:ibus-table-chinese-wu-1.4.6-3.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/ibus-table-chinese-wu-1.4.6-3.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
宿舍管理系统(源码+数据库+论文+ppt)java开发springboot框架javaweb,可做计算机毕业设计或课程设计 【功能需求】 系统拥有管理员和学生两个角色,主要具备系统首页、个人中心、学生管理、宿舍信息管理、宿舍分配管理、水电费管理、进入宿舍管理、出入宿舍管理、维修信息管理、卫生信息管理、考勤信息管理、留言板、交流论坛、系统管理等功能模块。 【环境需要】 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.数据库:MySql 5.7/8.0等版本均可; 【购买须知】 本源码项目经过严格的调试,项目已确保无误,可直接用于课程实训或毕业设计提交。里面都有配套的运行环境软件,讲解视频,部署视频教程,一应俱全,可以自己按照教程导入运行。附有论文参考,使学习者能够快速掌握系统设计和实现的核心技术。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
人凤飞飞凤飞飞是粉色丰富
2024蓝桥杯嵌入式学习资料
image_download_1740129191509.jpg
基于Multisim仿真的带优先病房呼叫系统设计(仿真图) 设计一个病房呼叫系统。 功能 (1)当有病人紧急呼叫时,产生声,光提示,并显示病人的编号; (2)根据病人的病情设计优先级别,当有多人呼叫时,病情严重者优先; (3)医护人员处理完当前最高级别的呼叫后,系统按优先级别显示其他呼叫病人的病号。
基于STM32F103的3.6kW全桥逆变器资料:并网充电放电、智能切换与全方位保护方案,基于STM32F103的3.6kW全桥逆变器资料:并网充电放电、智能控制与全方位保护方案,逆变器光伏逆变器,3.6kw储能逆变器全套资料 STM32储能逆变器 BOOST 全桥 基于STM32F103设计,具有并网充电、放电;并网离网自动切;485通讯,在线升级;风扇智能控制,提供过流、过压、短路、过温等全方位保护。 基于arm的方案区别于dsp。 有PCB、原理图及代码ad文件。 ,逆变器; 储能逆变器; STM32F103; 3.6kw; 485通讯; 全方位保护; 智能控制; 方案区别; PCB文件; 原理图文件; ad文件。,基于STM32F103的3.6kw储能逆变器:全方位保护与智能控制