我觉得事务的管理不应该属于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. linux工具-journalctl查询日志

    有时候,当linux服务启动失败的时候,系统会提示我们使用journalctl -xe命令来查询详细信息,定位服务不能启动的原因. journalctl 用来查询 systemd-journald 服 ...

  2. docker启动,重启,停止容器

    docker 启动已经停止的容器 docker start 容器ID或容器名 docker 停止容器 docker stop 容器ID或容器名 docker 启动一个容器 -d:后台运行 -p:端口映 ...

  3. Day05(fianl、抽象类、接口)

    final关键字修饰的类不能被继承.修改,修饰的方法不能被子类覆盖,修饰的变量(是常量)不能被修改. 抽象类:abstract关键字定义的类 继承树中越是在上方的类越抽象,在解决实际问题时,通常将父类 ...

  4. JSP项目前端优化

    问题:在谷歌浏览器中兼容问题,在点击超链接第一次会跳到头部,第二次点击才能打开的问题. 解决方案:是href的问题,删除href的属性,使用click事件,并添加a的超链接样式. #othera{ c ...

  5. 学习java23种设计模式自我总结

    首先先做个广告,以前看过@maowang 这位大神转的Java开发中的23种设计模式详解(转) ,但是看了之后都忘差不多了, 所以,开个帖子边学习边自我总结(纯手敲).一直以来像这种需要长久的运动,真 ...

  6. 【Linux】Ubuntu安装Mysql 8.0

    1.下载Mysql的安装配置,http://dev.mysql.com/downloads/repo/apt/ 2.执行配置配置文件 sudo dpkg -i mysql-apt-config_0.* ...

  7. Metaphor of quotient space

    In James Munkres "Topology" Section 22, the quotient space is defined as below. Definition ...

  8. Mix 导航

    Mix 导航 一.程序员必备技能 Markdonw 使用 Git 常用命令 二.分析设计 UML 三.其他 博客园代码样式修改

  9. mysql 8.0 密码加密方式的坑

    问题:新安装好MySQL 8.0和Navicat之后,连接时总是报: 1251 Client does not support authentication protocol requested by ...

  10. iOS开发之图片压缩实现

    使用下面两个方法,先按尺寸重绘图片,然后再降低品质上传图片data #pragma mark 裁剪照片 -(UIImage *)scaleToSize:(UIImage *)image size:(C ...