`
darrenzhu
  • 浏览: 806958 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

分布式事务XA,JTA,两阶段提交,BASE

阅读更多
关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究
http://blog.csdn.net/bluishglc/article/details/7612811

作者:谢照东
链接:http://www.zhihu.com/question/29483490/answer/107142534
来源:知乎

比如事务补偿机制:即在事务链中的任何一个正向事务操作,都必须存在一个完全符合回滚规则的可逆事务。

或者两阶段提交、三阶段提交:分布式事务服务(DTS) 支付宝的DTS实现!最近也看见一个tcc方案GitHub - changmingxie/tcc-transaction: tcc-transaction是TCC型事务java实现 还没有线上试过

或者利用消息系统(转载自高可用架构公众号)
经典方案 - eBay 模式
此方案的核心是将需要分布式处理的任务通过消息日志的方式来异步执行。消息日志可以存储到本地文本、数据库或消息队列,再通过业务规则自动或人工发起重试。人工重试更多的是应用于支付场景,通过对账系统对事后问题的处理。
消息日志方案的核心是保证服务接口的幂等性。
考虑到网络通讯失败、数据丢包等原因,如果接口不能保证幂等性,数据的唯一性将很难保证。
eBay 方式的主要思路如下。
Base:一种 Acid 的替代方案
此方案是 eBay 的架构师 Dan Pritchett 在 2008 年发表给 ACM 的文章,是一篇解释 BASE 原则,或者说最终一致性的经典文章。文中讨论了 BASE 与 ACID 原则在保证数据一致性的基本差异。
如果 ACID 为分区的数据库提供一致性的选择,那么如何实现可用性呢?答案是
BASE (basically available, soft state, eventually consistent)
BASE 的可用性是通过支持局部故障而不是系统全局故障来实现的。下面是一个简单的例子:如果将用户分区在 5 个数据库服务器上,BASE 设计鼓励类似的处理方式,一个用户数据库的故障只影响这台特定主机那 20% 的用户。这里不涉及任何魔法,不过它确实可以带来更高的可感知的系统可用性。
文章中描述了一个最常见的场景,如果产生了一笔交易,需要在交易表增加记录,同时还要修改用户表的金额。这两个表属于不同的远程服务,所以就涉及到分布式事务一致性的问题。




文中提出了一个经典的解决方法,将主要修改操作以及更新用户表的消息放在一个本地事务来完成。同时为了避免重复消费用户表消息带来的问题,达到多次重试的幂等性,增加一个更新记录表 updates_applied 来记录已经处理过的消息。



系统的执行伪代码如下



基于以上方法,在第一阶段,通过本地的数据库的事务保障,增加了 transaction 表及消息队列 。
在第二阶段,分别读出消息队列(但不删除),通过判断更新记录表 updates_applied 来检测相关记录是否被执行,未被执行的记录会修改 user 表,然后增加一条操作记录到 updates_applied,事务执行成功之后再删除队列。
通过以上方法,达到了分布式系统的最终一致性。进一步了解 eBay 的方案可以参考文末链接。


或者在业务层面整合,整合成本地事务的方式。





Dubbo分布式事务
http://javatar.iteye.com/blog/981787

http://www.javaworld.com/article/2077963/open-source-tools/distributed-transactions-in-spring--with-and-without-xa.html
  • 大小: 194.7 KB
  • 大小: 159.2 KB
  • 大小: 253.7 KB
分享到:
评论

相关推荐

    分布式事务实践 解决数据一致性

    还有XA以及两阶段提交,并通过实例演示了使用JTA,通过两阶段提交,实现多数据源的事务实现。... 4-1 Spring事务机制_基本接口 4-2 Spring事务机制_实现 4-3 Jpa事务实例 4-4 Jms事务原理 4-5 Jms-session事务实例 4...

    多数据源分布式事务管理调研报告.zip

    - 2PC(两阶段提交):最传统的分布式事务协议,由准备阶段和提交阶段组成。虽然简单,但存在阻塞和单点故障问题。 - TCC(Try-Confirm-Cancel):每个服务提供try、confirm和cancel三个操作,尝试执行、确认执行...

    龙果学院--微服务架构的分布式事务解决方案--第03节--常用的分布式事务解决方案介绍

    - 第二阶段(提交阶段):如果所有参与者都同意,则协调者发送“提交”指令;如果有任何参与者拒绝,则发送“回滚”指令。 #### 四、Java EE平台中的分布式事务实现 在Java EE平台中,分布式事务可以通过以下几种...

    分布式事务入门

    1. 两阶段提交(2PC,Two-Phase Commit):2PC是最基础的分布式事务协议,分为准备阶段和提交阶段。虽然简单,但存在阻塞问题和单点故障风险。 2. 三阶段提交(3PC,Three-Phase Commit):为了解决2PC的缺点,引入...

    分布式事务解决方案「手写代码」视频教程

    分布式事务解决方案「手写代码」,完整版视频教程下载。 课程大纲 1.基础概念:了解事务的ACID、CAP理论、BASE理论,为分布式方案打基础 2.2PC/3PC:通过2PC演化各种方案:XA方案、JTA、LCN、Seata 3.TCC:TCC不依赖...

    分布式事务

    1. 两阶段提交(2PC):是最经典的分布式事务解决方案,由一个协调者和多个参与者组成,分为准备阶段和提交阶段。然而,2PC存在单点故障和阻塞问题。 2. 三阶段提交(3PC):在2PC的基础上增加了预提交阶段,降低了...

    spring4+atomikos实现分布式事务

    在上述代码中,`crossDatabaseOperation`方法内的两个数据库操作将被包含在一个分布式事务中。即使其中一个数据库操作失败,Atomikos也会确保两个数据库的状态都恢复到事务开始前的状态,实现了ACID(原子性、一致性...

    基于RabbitMQ消息队列的分布式事务解决方案-MQ分布式消息中间件实战.docx

    4. **TCC编程式解决方案**:这种方案通过预先定义好Try-Confirm-Cancel三个阶段的操作来实现分布式事务,适用于那些对事务控制有特殊需求的场景。 本文将重点介绍如何使用RabbitMQ作为消息中间件来解决分布式事务...

    基于RabbitMQ消息队列的分布式事务解决方案

    - **基于数据库的XA/JTA协议**:需要数据库支持,如Oracle、MySQL的分布式事务支持,但可能增加复杂性和性能开销。 - **异步校验数据**:如支付宝、微信支付通过主动查询支付状态来保持一致性,但可能会引入额外的...

    atomikos_3.7_jta项目整合jar包

    这个项目整合的jar包是针对Java Transaction API (JTA) 的扩展,提供了分布式事务管理功能,使得应用程序能够在多个数据库之间进行跨库事务操作。 JTA 是Java平台标准版(Java EE)的一部分,它定义了一个接口,...

    分布式JAVA应用+基础与实践

    Java提供JTA(Java Transaction API)和JTS(Java Transaction Service)来处理分布式事务,确保数据的一致性。X/Open XA规范也是处理分布式事务的重要标准。 7. 分布式锁与一致性 在分布式环境中,同步和一致性...

    超级有影响力霸气的Java面试题大全文档

    31、EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?  SessionBean: Stateless Session Bean 的生命周期是由容器决定的,当客户机发出请求要建立一个Bean的实例时,EJB容器不一定要创建...

Global site tag (gtag.js) - Google Analytics