X/Open DTP——分布式事务模型

转载:http://www.cnblogs.com/aigongsi/archive/2012/10/11/2718313.html

这一几天一直在回顾事务相关的知识,也准备把以前了解皮毛的知识进行一些深入总结,虽然这一些知识并没有用到,但是了解其实现原理还是很有必要的,因为知道了原理,你也能把它实现出来。

在上一节事务的编程模型里面,主要说明了三种编程模型,一般情况下,我们都接触的是单一资源的事务,也就是单独对一个数据库进行操作。如果需要跨多个资源保证事务一致性

举个例子:在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的程序

RM(Resource Manager):资源管理器,这里可以理解为一个DBMS系统,或者消息服务器管理系统,应用程序通过资源管理器对资源进行控制。资源必须实现XA定义的接口

TM(Transaction Manager):事务管理器,负责协调和管理事务,提供给AP应用程序编程接口以及管理资源管理器

其中,AP 可以和TM 以及 RM 通信,TM 和 RM 互相之间可以通信,DTP模型里面定义了XA接口,TM 和 RM 通过XA接口进行双向通信,例如:TM通知RM提交事务或者回滚事务,RM把提交结果通知给TM。AP和RM之间则通过RM提供的Native API 进行资源控制,这个没有进行约API和规范,各个厂商自己实现自己的资源控制,比如Oracle自己的数据库驱动程序。

下面一幅图说明了三者的关系:

其中在DTP定了以下几个概念:

事务:一个事务是一个完整的工作单元,由多个独立的计算任务组成,这多个任务在逻辑上是原子的。

全局事务:对于一次性操作多个资源管理器的事务,就是全局事务

分支事务:在全局事务中,某一个资源管理器有自己独立的任务,这些任务的集合作为这个资源管理器的分支任务

控制线程:用来表示一个工作线程,主要是关联AP,TM,RM三者的一个线程,也就是事务上下文环境。简单的说,就是需要标识一个全局事务以及分支事务的关系。

两阶段提交协议:如果一个事务管理器管理着多个资源管理器,如果控制全局事务和分支事务,在DTP里面说明两阶段提交的协议

第一阶段:准备阶段

事务管理器通知资源管理器准备分支事务,资源管理器告之事务管理器准备结果

第二阶段:提交阶段

事务管理器通知资源管理器提交分支事务,资源管理器告之事务管理器结果

下面一幅图演示了正常情况下的两阶段提交,

如果第一阶段某一个资源预提交失败,第二阶段就回滚第一阶段已经预提交成功的资源

以上是比较正常的情况,但是由于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的服务的实现就需要考虑以下几个问题:

  • 如何获取TM?
  • 如何启动和结束一个事务
  • 如何标识一个事务
  • 如何保存和传递事务上下文
  • 应用如何通过资源管理器操作共享资源
  • 资源管理器如何实现准备阶段以及与提交阶段的逻辑
  • 如何实现两阶段提交协议
  • 如何实现在异常情况下进行事务恢复

其实如果把这几个问题了解清楚了,就可以自己实现一个两阶段提交的分布式事务模型了。

时间: 2024-11-21 04:26:46

X/Open DTP——分布式事务模型的相关文章

分布式事务(两阶段提交)模型详解

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt369 这一几天一直在回顾事务相关的知识,也准备把以前了解皮毛的知识进行一些深入总结,虽然这一些知识并没有用到,但是了解其实现原理还是很有必要的,因为知道了原理,你也能把它实现出来. 在上一节事务的编程模型里面,主要说明了三种编程模型,一般情况下,我们都接触的是单一资源的事务,也就是单独对一个数据库进行操作.如果需要跨多个资源保证事务一致性 举个例子:在ATM机取钱的时候,需

关于分布式事务的随笔[待续]

传统开发中,系统往往是以单体应用形式存在的,没有横跨多个数据库.我们利用关系型数据库自带的事务管理机制就能满足业务中对事务的需求.而大型互联网平台往往是由一系列分布式系统构成的,在SOA和微服务架构盛行的今天,一个看起来简单的功能,内部可能需要调用多个服务(并操作其下的多个数据库),情况会复杂很多. 在分布式系统中,不可能同时满足"一致性"."可用性"和"分区容错性".在互联网的大多数的场景,往往选择牺牲强一致性来换取高可用性,系统只需要保证&q

分布式事务解决方案---阅读--篇1--关于分布式系统的数据一致性问题

self: 这篇文章逻辑不算很清晰,但讲到的点还算是比较好的.自己总结一下可以做不错的参考: 1. 这边文章主要讲了两个方面,一方面是MQ的消息可靠性问题,另一方面是MQ可以被利用来做补偿机制的最终一致性分布式事务解决方案. 2. 关于MQ消息的问题大致有下面三个 2.1 如何保证A->M的消息,M一定接收到了,同样,如何保证M->A的消息,M一定接收到了 2.2 如果数据需要一致性更新,比如A发送了三条消息给M,M要么全部保存,要么全部不保存,不能够只保存其中的几条记录.我们假设更新的数据是

蚂蚁技术专家:一篇文章带你学习分布式事务

小蚂蚁说: 分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在这几年越来越火的微服务架构中,几乎可以说是无法避免,本文就围绕分布式事务各方面与大家进行介绍. 一. 事务 1.1 什么是事务 数据库事务(简称:事务,Transaction)是指数据库执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成. 事务拥有以下四个特性,习惯上被称为ACID特性: 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要

搞懂分布式技术17,18:分布式事务总结

搞懂分布式技术17:浅析分布式事务 众所周知,数据库能实现本地事务,也就是在同一个数据库中,你可以允许一组操作要么全都正确执行,要么全都不执行.这里特别强调了本地事务,也就是目前的数据库只能支持同一个数据库中的事务.但现在的系统往往采用微服务架构,业务系统拥有独立的数据库,因此就出现了跨多个数据库的事务需求,这种事务即为"分布式事务".那么在目前数据库不支持跨库事务的情况下,我们应该如何实现分布式事务呢?本文首先会为大家梳理分布式事务的基本概念和理论基础,然后介绍几种目前常用的分布式事

[转帖]分布式事务之解决方案(XA和2PC)

分布式事务之解决方案(XA和2PC) https://zhuanlan.zhihu.com/p/93459200 3. 分布式事务解决方案之2PC(两阶段提交) 针对不同的分布式场景业界常见的解决方案有2PC.TCC.可靠消息最终一致性.最大努力通知这几种. 3.1. 什么是2PC 2PC即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段(Prepare phase).提交阶段(commit phase),2是指两阶段,P是指准备阶段,C是提交阶段.举例 :张三和李四好久不见,老友约起聚餐

使用Atomikos实现JTA分布式事务

使用Atomikos实现JTA分布式事务 在这篇文章中: 1.1 JTA事务模型 2 JTA规范接口 3 Atomikos分布式事务 本文全面的介绍了JTA分布式事务模型和接口规范,以及开源的分布式事务解决方案Atomikos.笔者认同"talk is cheap,show me the code",因此在文章最后,给出一个完整的Atomikos与spring.mybatis整合的完整案例. 1 JTA规范 Java事务API(JTA:Java Transaction API)和它的同

常用的分布式事务解决方案

众所周知,数据库能实现本地事务,也就是在同一个数据库中,你可以允许一组操作要么全都正确执行,要么全都不执行.这里特别强调了本地事务,也就是目前的数据库只能支持同一个数据库中的事务.但现在的系统往往采用微服务架构,业务系统拥有独立的数据库,因此就出现了跨多个数据库的事务需求,这种事务即为"分布式事务".那么在目前数据库不支持跨库事务的情况下,我们应该如何实现分布式事务呢?本文首先会为大家梳理分布式事务的基本概念和理论基础,然后介绍几种目前常用的分布式事务解决方案.废话不多说,那就开始吧-

浅述Oracle分布式事务概念

着系统的复杂性不断增加,我们所面对的分布式系统渐渐增加.分布式文件系统.分布式消息队列系统等等层出不穷,在一些行业特别是互联网行业应用广泛.分布式数据库也是目前使用比较常用的分布式系统之一. 简单来说,分布式数据库就是通过多个相互连接的数据库节点(注意不是Instance),来支持前端系统数据访问需要的数据库组织结构.各个节点之间相互独立.自我管理(site autonomy).分布式数据库系统追求的主要目标包括:可用性(availability).准确性(accuray).一致性(concur