这一几天一直在回顾事务相关的知识,也准备把之前了解皮毛的知识进行一些深刻总结,虽然这一些知识并无用到,可是了解其实现原理仍是颇有必要的,由于知道了原理,你也能把它实现出来。java
在上一节事务的编程模型里面,主要说明了三种编程模型,通常状况下,咱们都接触的是单一资源的事务,也就是单独对一个数据库进行操做。若是须要跨多个资源保证事务一致性数据库
举个例子:在ATM机取钱的时候,须要对用户的帐户进行扣款处理,而后发送一条消息给消息服务器(假设消息服务器是用JMS实现的),由消息服务器异步经过短信通知用户。若是用户取款失败,那么消息服务器不该该发送短信给用户。如何保证 用户账务扣款 和 消息服务器的消息保持一致性,也就是说 取款成功,消息服务器就持久化消息,而后发送短信给用户,取款失败,消息服务器就回滚消息,啥都不作。编程
在上面这种状况下,就须要使用分布式事务,也就是跨越多个资源的保证数据一致性。服务器
X/Open DTP(X/Open Distributed Transaction Processing Reference Model) 是X/Open 这个组织定义的一套分布式事务的标准,也就是了定义了规范和API接口,由这个厂商进行具体的实现。这个思想在java 平台里面处处都是。异步
X/Open DTP 定义了三个组件: AP,TM,RM分布式
AP(Application Program):也就是应用程序,能够理解为使用DTP的程序spa
RM(Resource Manager):资源管理器,这里能够理解为一个DBMS系统,或者消息服务器管理系统,应用程序经过资源管理器对资源进行控制。资源必须实现XA定义的接口线程
TM(Transaction Manager):事务管理器,负责协调和管理事务,提供给AP应用程序编程接口以及管理资源管理器3d
其中,AP 能够和TM 以及 RM 通讯,TM 和 RM 互相之间能够通讯,DTP模型里面定义了XA接口,TM 和 RM 经过XA接口进行双向通讯,例如:TM通知RM提交事务或者回滚事务,RM把提交结果通知给TM。AP和RM之间则经过RM提供的Native API 进行资源控制,这个没有进行约API和规范,各个厂商本身实现本身的资源控制,好比Oracle本身的数据库驱动程序。blog
下面一幅图说明了三者的关系:
其中在DTP定了如下几个概念:
事务:一个事务是一个完整的工做单元,由多个独立的计算任务组成,这多个任务在逻辑上是原子的。
全局事务:对于一次性操做多个资源管理器的事务,就是全局事务
分支事务:在全局事务中,某一个资源管理器有本身独立的任务,这些任务的集合做为这个资源管理器的分支任务
控制线程:用来表示一个工做线程,主要是关联AP,TM,RM三者的一个线程,也就是事务上下文环境。简单的说,就是须要标识一个全局事务以及分支事务的关系。
第一阶段:准备阶段
事务管理器通知资源管理器准备分支事务,资源管理器告之事务管理器准备结果
第二阶段:提交阶段
事务管理器通知资源管理器提交分支事务,资源管理器告之事务管理器结果
下面一幅图演示了正常状况下的两阶段提交,
若是第一阶段某一个资源预提交失败,第二阶段就回滚第一阶段已经预提交成功的资源
以上是比较正常的状况,可是因为RM有权利本身根据状况提交或者回滚本身的分支事务(官方说法是:Heuristic Decision)那三么就可能出现如下种状况:
1 在TM通知RM提交事务以前,RM分支事务已经提交
2 在TM通知RM提交事务以前,RM分支事务所有回滚
3 在TM通知RM提交事务以前,RM分支事务部分回滚
对于Heuristic Decision标记的分支事务,在没有TM通知RM forget 它以前,RM都必须保存分支事务的信息,等到TM从失败中恢复事务以后,通知RM forget 分支事务,这个时候RM才真正的完成事务。
对于前面两种状况来讲,TM会比较好处理,作事务恢复的时候,要么标记全局事务成功,要么标记全局事务回滚,通知RM能够完成分支事务了。对于第三种状况,可能就须要进行决策了,这个具体怎么处理,貌似DTP并无说明细节,能够交给应用本身去判断。
DTP编程模型
虽然DTP内部的实现比较复杂,可是对于DTP编程模型就比较简单了
1 AP经过TM获取事务
2 AP申明须要哪些RM,TM注册RM
3 AP使用RM完成分支事务
4 AP经过TM提交事务
5 TM通知RM提交事务
而DTP的服务的实现就须要考虑如下几个问题:
其实若是把这几个问题了解清楚了,就能够本身实现一个两阶段提交的分布式事务模型了。