我觉得事务的管理不应该属于Dubbo框架, 
Dubbo只需实现可被事务管理即可, 
像JDBC和JMS都是可被事务管理的分布式资源, 
Dubbo只要实现相同的可被事务管理的行为,比如可以回滚, 
其它事务的调度,都应该由专门的事务管理器实现。

在Java中,分布式事务主要的规范是JTA/XA, 
其中:JTA是Java的事务管理器规范, 
XA是工业标准的X/Open CAE规范,可被两阶段提交及回滚的事务资源定义, 
比如某数据库实现了XA规范,则不管是JTA,还是MSDTC,都可以基于同样的行为对该数据库进行事务处理。

在JTA/XA中,主要有两个扩展点:

(1) TransactionManager 
JTA事务管理器接口,实现该接口,即可完成对所有XA资源的事务调度,比如BEA的Tuxedo,JBossJTA等。

(2) XAResource 
XA资源接口,实现该接口,即可被任意TransactionManager调度,比如:JDBC的XAConnection,JMS的XAMQ等。

而Dubbo的远程服务,也应该是一个XAResource,比如:XAInvoker和XAExporter, 
Dubbo只需在第一次提交时,将请求发到服务提供方进行缓存和写盘, 
在第二次提交时,再基于缓存调用服务的Impl实现, 
当然一些健状性分支流程要考虑清楚。

JTA/XA的基本原理如下:

1. 用户启动一个事务:

  1. transactionManager.begin();

2. 事务管理器在当前线程中初始化一个事务实例:

  1. threadLocal.set(new TransactionImpl());

3. 用户调用JDBC或JMS或Dubbo请求,请求内部初始化一个XAResource实例:

  1. XAResource xaResource = new XAResourceImpl(); // 比如:XAConnection

4. JDBC或JMS或Dubbo内部从当前线程获取事务:

  1. Transaction transaction = transactionManager.getTransaction(); // 其内部为:threadLocal.get();

5. 将当前XAResource注册到事务中:

  1. transaction.enlistResource(xaResource);

6. 用户提交一个事务:

  1. transactionManager.commit(); // 其内部为:getTransaction().commit();

7. 事务for循环调用所有注册的XAResource的两阶段提交:

  1. Xid xid = new XidImpl();
  2. for (XAResource xaResource: xaResources) {
  3. xaResource.prepare(xid);
  4. xaResource.commit(xid, true);
  5. xaResource.commit(xid, false);
  6. }

8. 当然,还有一些异常流程,比如rollback和forget等。

举例:

  1. TransactionManager transactionManager = ...; // 从JNDI进行lookup等方式获取
  2. transactionManager.begin(); // 启动事务
  3. try {
  4. jdbcConn.executeUpdate(sql); // 执行SQL语句,DB写入binlog,但不更新表
  5. jmsMQ.send(message); // 发送消息,MQ记录消息,但不进入队列
  6. dubboService.invoke(parameters); // 调用远程服务,Provider缓存请求信息,但不执行
  7. transactionManager.commit(); // 提交事务,数据库,消息队列,远程服务同时提交
  8. } catch(Throwable t) {
  9. transactionManager.rollback(); // 回滚事务,数据库,消息队列,远程服务同时回滚
  10. }
http://javatar.iteye.com/blog/981787
 

Dubbo 分布式事务一致性实现的更多相关文章

  1. 六:分布式事务一致性协议paxos的分析

    最近研究paxos算法,看了许多相关的文章,概念还是很模糊,觉得还是没有掌握paxos算法的精髓,所以花了3天时间分析了libpaxos3的所有代码,此代码可以从https://bitbucket.o ...

  2. 三:分布式事务一致性协议2pc和3pc

    一:分布式一致性协议--->对于一个分布式系统进行架构设计的过程中,往往会在系统的可用性和数据一致性之间进行反复的权衡,于是就产生了一系列的一致性协议.--->长期探索涌现出一大批经典的一 ...

  3. 【原】ActiveMq实现分布式事务一致性

    前言:关于分布式事务话题一直是颇有争议的话题,在本文中通过ActiveMq 实现分布式事务做一个简单的demo;同时也让自己能在实践中可以获取经验和对分布式事务自己的一些思考. 1.本地事务 我们通常 ...

  4. 五:分布式事务一致性协议paxos的应用场景

    1.应用场景 (1)分布式中的一致性 Paxos算法主要是解决一致性问题,关于“一致性”,在不同的场景有不同的解释: NoSQL领域:一致性更强调“能读到新写入的”,就是读写一致性数据库领域:一致性强 ...

  5. 四:分布式事务一致性协议paxos通俗理解

    转载地址:http://www.lxway.com/4618606.htm 维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La" ...

  6. 分布式事务 spring 两阶段提交 tcc

    请问分布式事务一致性与raft或paxos协议解决的一致性问题是同一回事吗? - 知乎 https://www.zhihu.com/question/275845393 分布式事务11_TCC 两阶段 ...

  7. 分布式事务(四)之TCC

    在电商领域等互联网场景下,传统的事务在数据库性能和处理能力上都暴露出了瓶颈.在分布式领域基于CAP理论以及BASE理论,有人就提出了柔性事务的概念.在业内,关于柔性事务,最主要的有以下四种类型:两阶段 ...

  8. 分布式事务框架-Litx补偿事务框架源码解析

    前言 之前某段时间在研究分布式事务过程中,对实现原理比较好奇,于是去Gitee上找了几个人气比较高的框架进行学习,其中印象深刻的有Litx,因为Litx源码不多,且都是基于Spring和Dubbo底层 ...

  9. 基于Dubbo的分布式事务框架(LCN)

    原文地址:http://原文地址:https://github.com/1991wangliang/transaction 基于Dubbo的分布式事务框架(LCN) 该框架依赖Redis/dubbo/ ...

随机推荐

  1. 2-3、配置Filebeat

    配置Filebeat 提示:Filebeat modules为常见的日志格式提供了最快的入门操作. 如果要使用Filebeat模块,请跳过本节,包括剩余的入门步骤,并直接转到快速入门:Quick st ...

  2. sql 随笔更新

    SELECT DISTINCT(p.`id`), p.`id` , v.`full_name` , CONCAT(LEFT(v.mobile, 7), '****') , DATE_FORMAT(DA ...

  3. jdk1.8安装

    jdk1.8:链接: https://pan.baidu.com/s/1Orv7Rjz0jkprcdoRSFWiPw 提取码: rn73 设置jdk和jre文件位置 配置环境变量: 系统变量中jdk ...

  4. notes for lxf(二)

    函数 abs()绝对值 max()返回最大值 raise 后接异常类 引发异常 函数返回多个值其实就是返回一个tuple 函数默认返回None 如果有必要检查参数类型用isinstance() typ ...

  5. (转载)Linux终端复用神器-Tmux使用

    Linux终端复用神器-Tmux使用 转载地址:https://blog.51cto.com/652465/2094738 Tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于Open ...

  6. powershell_基础篇

    powershell 想必大家对windows操作系统下的cmd命令提示符可能并不陌生,大多数人都应该使用过它.而对于今天我们要学习的PowerShell跟cmd有什么关系呢?可以简单地说,Power ...

  7. 雕刻机制作 PCB 指南

    之前使用过感光蓝油制作过 PCB,虽然感光法精度高,但个人制作耗时耗力,发给厂家周期又很长.看到国外的网友使用雕刻机制作 PCB  视频之后.几番周折之后还是成功了.有感于网上几乎没有一份完整的雕刻机 ...

  8. JavaScript前端开发案例教程第二章练习

    一.打印金字塔: 这是各种语言学习之处都要做的一道题,最近在重新学习js,看到了这个题,做一下记录. 1 <script type="text/javascript"> ...

  9. SpringBoot报错:Failed to load ApplicationContext( Failed to bind properties under 'logging.level')

    引起条件: SpringBoot2.0下yml文件配置SLF4j日志输出日志级别 logging: level: debug 解决方法: 指定系统包路径 logging: root: debug 指定 ...

  10. 请问浏览器访问www.baidu.com经历了怎样的过程?

    1.查找浏览器缓存 首先会查找浏览器缓存,浏览器会保存一段时间你之前访问过的网址的DNS信息,不同的浏览器保存的时长不等. 2.查找系统缓存 如果上面的步骤没有找到对应的DNS信息,这个时候浏览器会尝 ...