我觉得事务的管理不应该属于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. 初识C语言 (四)

    分支结构 if语句 C语言中的分支结构语句中的if条件语句,简单if语句的基本结构如下: 其语义是:如果表达式的值为真,则执行其后的语句,否则不执行该语句. 其过程可表示为下图 实例: if(resu ...

  2. bzoj 2599

    还是点对之间的问题,果断上点分治 同样,把一条路径拆分成经过根节点的两条路径,对不经过根节点的路径递归处理 然后,我们逐个枚举根节点的子树,计算出子树中某一点到根节点的距离,然后在之前已经处理过的点中 ...

  3. js高级类型

    一.funciton数据类型 1.定义:一个function类型对象,用于管理一个具体函数. function类型相当于Java中java.lang.reflect.Method 2.函数类型对象创建 ...

  4. urlparse解析URL参数

    python2 #! /usr/bin/env python # -*- coding:utf8 -*- # Author:zhangning import urlparse def url2Dict ...

  5. Scrapyd 改进第一步: Web Interface 添加 charset=UTF-8, 避免查看 log 出现中文乱码

    0.问题现象和原因 如下图所示,由于 Scrapyd 的 Web Interface 的 log 链接直接指向 log 文件,Response Headers 的 Content-Type 又没有声明 ...

  6. C语言 第三次作业--函数

    1.本章学习总结 1.1 思维导图 1.2本章学习体会及代码量学习体会 1.2.1学习体会 学习C语言也半个学期了,前天也才刚刚进行了半期考试,emmm,成绩很差,可以反应出来我这半学期学习的效果并不 ...

  7. Linux磁盘和文件系统管理

    1.检测并确认新硬盘 挂载好新的硬盘设备并启动主机后,Linux系统会自动检测并加载该硬盘,无须额外安装驱动.执行“fdisk -l”命令即可查看,确认新增硬盘的设备名称和位置.作用:列出当前系统中所 ...

  8. CentOs查看某个字符串在某个目录下的行数

    如果你想在当前目录下 查找"hello,world!"字符串,可以这样: grep -rn "hello,world!" ./ ./ : 表示路径为当前目录. ...

  9. 普通用户添加sudo权限

    1.切换超级用户 su - root 2.编辑配置文件 vim /etc/sudoers ## Allow root to run any commands anywhere root ALL=(AL ...

  10. [Python]CentOS - ImportError: No module named '_curses'

    网上搜了不少答案, 基本都是说Windows环境下curses包不适用的问题. 作为碰到这个问题的linux用户,实在感到无奈. 起因是在CentOS上部署uwsgi,想要使用uwsgitop来监控. ...