全局事务/分布式事务 (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(两阶段提交) 针对不同的分布式场景业界常见的解决方案 ...
随机推荐
- zoj3229 有源汇上下界最大流
题意:有一个人每天给妹子拍照,每个妹子有最少拍照数,每天有最大拍照数,每天只能给某些特定的妹子拍照,求最大拍照数 题解:很容易看出来的有源汇上下界最大流,对于有源汇 的上下界最大流,我们按照无源汇的操 ...
- hdu1542线段树+离散化+扫描线
参考博客: http://blog.csdn.net/xingyeyongheng/article/details/8927732 总的来说就是用一条(假想的)线段去平行x轴从下往上扫描,扫描的过程中 ...
- 2015 Benelux Algorithm Programming Contest (BAPC 15)E - Excellent Engineers
这题想了很久没思路,不知道怎么不sort维护二维的最小值 emmmm原来是线段树/树状数组,一维sort,二维当成下标,维护三维的最小值 #include<bits/stdc++.h> # ...
- 如何关闭Windows10系统更新
单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”搜索 在结果中选择查看本地服务 在服务列表中找到windows update服务双击它 点击停止按钮先停止该服务,稍等片 ...
- SQL Server 删除默认值
alter table st_FuelConvertPatternSetting alter column tank_max_size decimal(5,2) not null declare @c ...
- Data、String、Long三种日期类型之间的相互转换
// date类型转换为String类型 // formatType格式为yyyy-MM-dd HH:mm:ss//yyyy年MM月dd日 HH时mm分ss秒 // data Date类型的时间 pu ...
- @angular/cli项目构建--路由3
路由定位: modifyUser(user) { this.router.navigate(['/auction/users', user.id]); } 路由定义: {path: 'users/:i ...
- Rebranding(字母代换)
个人心得:题目意思就是每次给出可以互换的字母,如果每次命令的时候就执行的话一定会超时. 所以我就是将输入的字母从a到z的数目和路径依次保存,再建立一个book数组表示字母现在所指的字母 ,一开始就直接 ...
- 10.Selenium+Python+任务计划程序实现定时发送邮件
一.python具体代码实现 # coding=utf-8 import smtplib from email.mime.text import MIMEText from email.header ...
- 使用navicat进行数据表迁移
使用navicat进行数据和表迁移只需要复制,粘贴就可以实现.