全局事务/分布式事务 (Global Transaction/ A distributed transaction)之我见
这里参考的是Oracle对于XA的支持,其他的应该雷同吧。。。
1个分布式事务由多个行为在不同的数据库上执行,1个分布式事务的执行成功意味着相关数据库上的行为执行均成功。“XA协定”(http://www.opengroup.org/public/pubs/catalog/c193.htm)就支持分布式的事务,具备能力,让多个独立的事务资源参加全局的事务。事务资源通常是RDBMSs,不过也可以是其它种类的资源。
一个典型的全局性事务的架构如下,通常来说TM会集成在Application Server(例如weblogic server)中。这种TM也叫做external TM,区别于在MySQL DBMS或者Oracle DBMS中的管理本地事务的TM。

资源管理器(RM):用户提供通向事务的途径。数据库服务器(例如上面的Oracal DBMS)是一个种资源管理器。该管理器必须提交or回滚由RM管理的事务。
事务管理器(TM):用于协调作为一个分布式事务的一部分事务。通常XA的相关操作都在这里进行,而对于Client而言是透明的,TM(或许是个进程)通常是由TPM( transaction processing monitor,Texudo就有这个组件,所以Texudo也就本能地支持了全局事务)提供。
对于Client App而言,所有的Global Transaction都应该通过TM进行(在ORACLE中,是名字为TX的一组接口函数),TM再与RM通过XA接口(Oracle有提供这组函数)进行接洽。而所有的普通的针对同一个数据库的事务可以直接通过Native Interface进行。
在Oracle的文档里,一个Global Transaction被分为多个Branch。A branch is a unit of work contained within one RM. In the case of Oracle Database, each branch maps to a local transaction inside the database server.
理解全局性事务的关键是理解两阶段提交:
The Oracle XA library interface follows the two-phase commit protocol. The sequence of events is as follows:
- In the prepare phase, the TM asks each RM to guarantee that it can commit any part of the transaction. If this is possible, then the RM records its prepared state and replies affirmatively to the TM. If it is not possible, then the RM may roll back any work, reply negatively to the TM, and forget about the transaction. The protocol allows the application, or any RM, to roll back the transaction unilaterally until the prepare phase completes.
- In phase two, the TM records the commit decision and issues a commit or rollback to all RMs participating in the transaction. TM can issue a commit for an RM only if all RMs have replied affirmatively to phase one.
下面的一个例子是从Oracle的JDBC文档里搞出来的。基本上讲清楚了整个过程。特别注意的是,Note that for simplicity, this example combines code that would typically be in a middle tier with code that would typically be in a transaction manager (such as the XA resource method invocations and the creation of transaction IDs).
Oracle XA Code Sample 最底下一段
关于MySQL全局性事务的一些限制,http://jishu.zol.com.cn/4306.html和http://blog.sina.com.cn/s/blog_4673e6030101c7o4.html
一些疑问
对于MySQL的XA支持,如果在XA START/END之间的SQL语句挂了,作为RM的MySQL如何通知TM?提供的方法里只有XA PREPARE,在我的理解里,这个是用于表示第一阶段的提交成功了,于是TM就可以通过查看XA RECOVER看到PREPARE状态了。那么如何表示失败呢?超时总不太靠谱吧?
参考
http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_xa.htm#g1017655
http://docs.oracle.com/cd/B10500_01/java.920/a96654/xadistra.htm
http://liuhaodba.blog.51cto.com/6379925/1117647
http://www.iteedu.com/database/mysql/mysqlmanualcn/sql-syntax/xa.php
http://jishu.zol.com.cn/4306.html
http://blog.sina.com.cn/s/blog_4673e6030101c7o4.html
http://blog.csdn.net/mchdba/article/details/13076803
全局事务/分布式事务 (Global Transaction/ A distributed transaction)之我见的更多相关文章
- Seata–分布式事务
10.1 分布式事务基础 10.1.1 事务 事务指的就是一个操作单元,在这个操作单元中的所有操作最终要保持一致的行为,要么所有操作都成功,要么所有的操作都被撤销.简单地说,事务提供一种"要 ...
- 浅述Oracle分布式事务概念
着系统的复杂性不断增加,我们所面对的分布式系统渐渐增加.分布式文件系统.分布式消息队列系统等等层出不穷,在一些行业特别是互联网行业应用广泛.分布式数据库也是目前使用比较常用的分布式系统之一. 简单来说 ...
- j2ee中spring的分布式事务实现及解决方案
1 java事务类型 Java事务的类型有三种:JDBC事务.JTA(Java Transaction API)事务.容器事务. 常见的容器事务如Spring事务,容器事务主要是J2EE应用服务器提供 ...
- 阿里开源分布式事务解决方案 Fescar
微服务倡导将复杂的单体应用拆分为若干个功能简单.松耦合的服务,这样可以降低开发难度.增强扩展性.便于敏捷开发.当前被越来越多的开发者推崇,系统微服务化后,一个看似简单的功能,内部可能需要调用多个服务并 ...
- 分布式事务解决方案FESCAR
项目地址:FESCAR 以下是官网的文档.简介2019年,Fescar 是 阿里巴巴 开源的 分布式事务中间件,以 高效 并且对业务 0 侵入 的方式,解决 微服务 场景下面临的分布式事务问题. 1. ...
- 来了!阿里开源分布式事务解决方案 Fescar
摘要: 阿里妹导读:广为人知的阿里分布式事务解决方案:GTS(Global Transaction Service),已正式推出开源版本,取名为“Fescar”,希望帮助业界解决微服务架构下的分布式事 ...
- alibaba/fescar 阿里巴巴 开源 分布式事务中间件
Fescar 是 阿里巴巴 开源的 分布式事务中间件,以 高效 并且对业务 0 侵入 的方式,解决 微服务 场景下面临的分布式事务问题. 示例:https://github.com/windwant/ ...
- 分布式事务之解决方案(XA和2PC)
3. 分布式事务解决方案之2PC(两阶段提交) 针对不同的分布式场景业界常见的解决方案有2PC.TCC.可靠消息最终一致性.最大努力通知这几种. 3.1. 什么是2PC 2PC即两阶段提交协议,是将整 ...
- [转帖]分布式事务之解决方案(XA和2PC)
分布式事务之解决方案(XA和2PC) https://zhuanlan.zhihu.com/p/93459200 3. 分布式事务解决方案之2PC(两阶段提交) 针对不同的分布式场景业界常见的解决方案 ...
随机推荐
- java:管道流(线程间管道流)
class Send implements Runnable{ PipedOutputStream pos = null; public Send() { this.pos = new PipedOu ...
- Request对象获得参数方法:query和body方法
express框架Request对象获得参数方法:query和body方法 req.query 该属性用法很简单,直接获取地址栏传递的参数:例如: //引入依赖 var express = requi ...
- Generator函数介绍
Generator函数 基本概念 英文意思为 "生成器". generator函数是es6提供的一种异步编程解决方案,语法行为与传统函数完全不同.从状态上,首先我们把他理解成一种状 ...
- node.js 上传图片
依赖库 connect,gm,imagemagick,image-size connect:中间件 gm,imagemagick:用来处理图片如缩放.切割.添加文字水印等 image-szie:获取图 ...
- 【Oracle】实现Oracle数据库对象的一键升级
引言 公司内部的项目比较倾向于将业务逻辑放在oracle存储过程中实现,所以每次项目升级都涉及到很多的oracle表,存储过程等数据库对象的升级.然而采取的升级方式是比较"原始&qu ...
- 制作导航菜单分隔线的总结:用css3
经过百度统计中国中使用谷歌浏览器比较多,我很奇怪,我身边的同事很少用谷歌,唯一我用谷歌的原因就是看上它调试能力和模拟手机. 下面是我个人制作的 预览用谷歌浏览器. <!doctype html& ...
- nginx location配置与rewrite配置
注:原文出处 www.linuxidc.com/Linux/2015-06/119398.htm 1. location正则写法 一个示例: location =/{ # 精确匹配 / ,主机名后面不 ...
- svn 服务器安装包下载地址
svn 服务器安装包下载地址 https://www.visualsvn.com/server/download/
- Docker-安装与部署
本文在CentsOS下安装Docker 1.安装前准备工作 系统要求: 在CentOS下需要64位的CentsOS 7 OS requirements To install Docker, you ...
- 畅通工程(自己写的BFS,但后面想了下并查集更好更快)
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...