`
javatar
  • 浏览: 1704625 次
  • 性别: Icon_minigender_1
  • 来自: 杭州699号
社区版块
存档分类
最新评论

分布式事务

阅读更多
转于自己在公司的Blog:
http://pt.alibaba-inc.com/wp/experience_1264/distributed-transaction.html

关于Dubbo服务框架的分布式事务,虽然现在不急着做,但可以讨论一下。

我觉得事务的管理不应该属于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. 用户启动一个事务:
transactionManager.begin(); 


2. 事务管理器在当前线程中初始化一个事务实例:
threadLocal.set(new TransactionImpl());


3. 用户调用JDBC或JMS或Dubbo请求,请求内部初始化一个XAResource实例:
XAResource xaResource = new XAResourceImpl(); // 比如:XAConnection


4. JDBC或JMS或Dubbo内部从当前线程获取事务:
Transaction transaction = transactionManager.getTransaction(); // 其内部为:threadLocal.get();


5. 将当前XAResource注册到事务中:
transaction.enlistResource(xaResource);


6. 用户提交一个事务:
transactionManager.commit(); // 其内部为:getTransaction().commit();


7. 事务for循环调用所有注册的XAResource的两阶段提交:
Xid xid = new XidImpl();
for (XAResource xaResource: xaResources) {
xaResource.prepare(xid);
xaResource.commit(xid, true);
xaResource.commit(xid, false);
}


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

举例:
TransactionManager transactionManager = ...; // 从JNDI进行lookup等方式获取
transactionManager.begin(); // 启动事务
try {
    jdbcConn.executeUpdate(sql); // 执行SQL语句,DB写入binlog,但不更新表
    jmsMQ.send(message); // 发送消息,MQ记录消息,但不进入队列
    dubboService.invoke(parameters); // 调用远程服务,Provider缓存请求信息,但不执行
    transactionManager.commit(); // 提交事务,数据库,消息队列,远程服务同时提交
} catch(Throwable t) {
    transactionManager.rollback(); // 回滚事务,数据库,消息队列,远程服务同时回滚
}
  • 大小: 37 KB
分享到:
评论
12 楼 路呆呆丶 2017-06-15  
我基于spring的 tx下 PlatformTransactionManager,结合dubbo框架实现了对dubbo的分布式事务支持。框架很好的兼容并可以区分本地和分布式事务,并且该框架可以兼容任何基于spring的db框架,例如mybaits hibernate等。在需要的地方只需要添加一个分布式事务注解就行。我提供了一个TxManager服务来管理所有业务模块的事务调度,本身TxManager也可以做集群化。我把框架开源放在了github上,详细见:https://github.com/1991wangliang/transaction,希望大家多提提意见,共同帮我维护好框架。
11 楼 comedsh 2016-11-27  
Sequence diagram 有点小问题,在 6.start() 完了以后,应该执行 XAResource.end() 方法,让数据源的 XA Transaction 状态从 ACTIVE 进入 IDEL 状态;然后才能调用 9:prepare() 进入 PREPARED 状态;否则 XA Resource 会出错。
10 楼 hcq1986224 2015-12-01  
实现XAResource已经事务调度流程都不难,无非是dubbo服务回滚的不确定性,服务设计之初肯定都是以原子方式,如果发起方真的失败了,想要回滚dubbo原子服务产生的影响几乎不可能,因为不知道服务到底对哪种资源产生了影响,所以dubbo想要实现分布式事务,应该还是提供类似反交易或者补偿服务,发起方需要回滚时候,通过框架自动保证调用。
9 楼 guoshiguan 2015-09-21  
远程的分布式事务的方案不可能完美,不管是两段还是三段的事务,都是会有问题的。我相信支付宝的tcc这种方式也有相关的问题。但如果那种问题和反交易这种解决方案来比的话,那就不知好多少
8 楼 guoshiguan 2015-09-21  
lwclover 写道
lwclover 写道
存在两点问题:1.事务发起方宕机,服务端(Provider)应该需要回查,否则不知道是否成功。
2.如果这个过程包含两个远程调用,怎么办?


在加一点,dubbo服务的返回值做为其他的输入参数。

我觉得dubbo有返回值和事务并没有关系,因为,我不需要使用到dubbo服务的返回值,如果dubbo使用one way时,也不会去传播事务的上下文
7 楼 guoshiguan 2015-09-21  
lwclover 写道
存在两点问题:1.事务发起方宕机,服务端(Provider)应该需要回查,否则不知道是否成功。
2.如果这个过程包含两个远程调用,怎么办?

事务的传播可以用两种方式进行,一种是使用事务协调器,一种是使用协议本身来进行(粘滞连接)来进行,
使用第一种使用事务协调器的话,事务的传播是非常扁平的,事务的上下文依赖于事务协调器,如果事务发起方出现宕机,事务协调器会通知各事务的参与者进行回滚。这是可以不管有几个远程调用,这种方式,dubbo在请求时带上transactionId.
使用第二种的话,dubbo发起请求是把事务的上下文一起带过去,事务发起方提交是发起一个粘滞连接请求进行提交,应该会有比第一种更高的性能,但是只能适用于调用关系比较简单的情况,如果有异常,很多时候只能等待超时来进行回滚
6 楼 lwclover 2015-09-15  
lwclover 写道
存在两点问题:1.事务发起方宕机,服务端(Provider)应该需要回查,否则不知道是否成功。
2.如果这个过程包含两个远程调用,怎么办?


在加一点,dubbo服务的返回值做为其他的输入参数。
5 楼 lwclover 2015-09-15  
存在两点问题:1.事务发起方宕机,服务端(Provider)应该需要回查,否则不知道是否成功。
2.如果这个过程包含两个远程调用,怎么办?
4 楼 guoshiguan 2015-08-17  
我想在Dubbo上架一个事务的协调器来实现类似EJB的事务,两阶段的提交是一个耗时耗力的东西,类似的方案也没有一个是比较轻量的。
3 楼 hy2012_campus 2015-03-27  
我是遇到大牛了
2 楼 wxrmath9802 2015-03-03  
我理解事务无非是两种解决办法,一种是框架去解决,另一种是程序员在程序中控制。我觉得目前使用的dubbo,应该属于后一种,希望您详细举个实际案例说一下,在目前的环境中程序员手工控制该怎么做。
1 楼 gmh20052002 2013-12-06  
而Dubbo的远程服务,也应该是一个XAResource,比如:XAInvoker和XAExporter,
请问这个改如何实现,要自己扩展实现XAResource吧?

相关推荐

    java分布式事务demo

    Java分布式事务是大型分布式系统中不可或缺的一个重要组成部分,它确保在多个网络节点间的数据操作能够保持一致性和完整性。在分布式环境中,由于多个服务之间可能存在数据交互,因此需要一种机制来处理跨服务的数据...

    深入理解分布式事务,高并发下分布式事务的解决方案

    本文来自于csdn,本文主要从分布式的原因,事务特性,和解决方案中深入理解了分布式事务,希望对您的学习有所帮助。 分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的...

    深入理解分布式事务

    ### 深入理解分布式事务 #### 一、分布式事务定义及重要性 分布式事务是指在分布式系统中,为了确保跨多个节点上的操作能够正确地完成或者全部回滚,所采取的一种事务处理机制。在这样的场景下,事务的参与者、...

    springboot多数据源即分布式事务解决方案

    SpringBoot作为一款轻量级的框架,提供了便捷的多数据源配置和分布式事务管理方案,使得开发者能够高效地管理和操作不同的数据库。本文将详细探讨SpringBoot如何实现多数据源以及分布式事务。 首先,我们要理解什么...

    分布式事务若依框架文档

    ### 分布式事务若依框架文档 #### 一、分布式事务基本概念 在理解分布式事务之前,我们首先需要了解数据库事务的基本属性,即ACID特性。 - **原子性(Atomicity)**:事务中的所有操作要么全部成功,要么全部失败...

    基于Hyperf框架的TCC分布式事务组件.zip

    TCC(Try-Confirm-Cancel)模式是一种著名的分布式事务解决方案,它适用于大型微服务架构。本资料"基于Hyperf框架的TCC分布式事务组件"旨在帮助开发者理解如何在Hyperf这个高性能、轻量级的PHP微服务框架中实现TCC...

    浅谈分布式事务实现技术及应用场景探讨.pdf

    "浅谈分布式事务实现技术及应用场景探讨" 分布式事务是指在分布式系统中,多个节点之间的数据访问和更新操作集合,需要保证事务的原子性、一致性、隔离性和持久性。随着软件系统支持用户数的不断提高,对其架构的...

    java+spring+mybatis+mysql+RuoYi-atomikos-实现分布式事务.zip

    本项目"java+spring+mybatis+mysql+RuoYi-atomikos-实现分布式事务.zip"是一个基于若依(RuoYi)框架改造的多模块分布式事务解决方案,它利用了Atomikos这一强大的分布式事务管理器。以下将详细解析这个项目的知识点...

    微服务架构的分布式事务解决方案(Dubbo分布式事务处理)

    分布式事务是一个绕不过去的挑战!微服务架构本质上就是分布式服务化架构,微服务架构的流行,让分布式事务问题日益突出!尤其是在订单业务、资金业务等系统核心业务流程中,一定要有可靠的分布式事务解决方案来保证...

    若依框架分布式事务配置和项目启动手册

    《若依框架分布式事务配置与项目启动指南》 在当今的互联网时代,高并发、大数据量的业务场景对系统的性能和稳定性提出了更高要求,而分布式事务则是解决这些问题的关键技术之一。若依框架作为一款广受欢迎的Java...

    大规模SOA系统中的分布式事务处事

    在大规模的SOA(Service-Oriented Architecture,面向服务架构)系统中,分布式事务处理是一项至关重要的技术。这种架构通常涉及多个独立的服务协同工作,每个服务都可能有自己的数据存储,因此,确保这些服务之间的...

    spring+jotm+ibatis+mysql实现JTA分布式事务

    在IT行业中,分布式事务处理是复杂系统架构中的一个重要环节,特别是在多数据库或服务协同工作的场景下。本项目“spring+jotm+ibatis+mysql实现JTA分布式事务”旨在利用这些技术来确保在分布式环境中的数据一致性。...

    分布式事务源代码

    分布式事务是一种在分布式系统中处理数据一致性的重要技术。在大型网络应用中,数据往往分散在多个数据库或服务器上,为了保证这些数据的一致性,就需要使用分布式事务来协调跨多个节点的操作。本资料包“分布式事务...

    基于Java的分布式事务解决方案myth设计源码

    该项目是一个采用消息队列解决分布式事务的开源框架,基于Java语言开发(JDK1.8),并支持dubbo、springcloud、motan等RPC框架进行分布式事务处理。通过该项目,开发者可以学习并实践分布式事务的处理,为后续的...

    ejb3.0 分布式事务

    【ejb3.0 分布式事务详解】 在企业级Java应用中,EJB(Enterprise JavaBeans)3.0提供了一种强大而灵活的方式来处理分布式事务。分布式事务是指跨越多个数据库或资源管理器的单一逻辑操作,确保了数据的一致性和...

    分布式事务与Seata.pptx

    分布式事务与Seata 分布式事务是指在分布式系统中跨多个资源或服务进行的交易操作,需要保证操作的原子性、一致性、隔离性和持久性。分布式事务的解决方案包括Seata、TCC、SAGA、X/Open XA等。 分布式事务的产生是...

    分布式事务.pdf

    分布式事务是为了解决分布式系统中跨越多个节点的操作,要求这些操作要么全部成功要么全部失败的一种事务机制。它是为了保证在不同节点上的数据一致性而产生的概念。分布式事务广泛应用于微服务架构、数据库分库分表...

Global site tag (gtag.js) - Google Analytics