1、分布式事务模型 ACID 实现

1.1、X/Open XA 协议(XA)

最早的分布式事务模型是 X/Open 国际联盟提出的 X/Open Distributed Transaction Processing(DTP)模型,也就是大家常说的 X/Open XA 协议,简称XA 协议。 DTP模型如图:

  • TM:全局事务管理器
  • RM:多个资源管理器
  • AP:应用程序

全局事务管理器负责管理全局事务状态与参与的资源,协同资源一起提交或回滚;资源管理器则负责具体的资源操作。 XA 协议主要描述了 TM 与 RM 之间的接口,允许多个资源在同一分布式事务中访问。 基于 DTP 模型的分布式事务流程大致如下:

  • XA接口详解XA接口时双向的系统接口,用于事务管理器和多个资源管理器之间形成桥梁。
  • 事务管理器控制JTA事务,管理事务生命周期,并协调资源,在JTA中,事务管理器抽象为TransactionManager接口,并通过底层事务服务JTS(java事务服务)实现,资源管理器负责控制和管理实际资源(如数据库或者JMS(java消息服务)队列)。 下图说明事务管理器、资源管理器,以及JTA环境中客户应用之间的关系:

1.2、阶段提交(2PC)

(1)概念:二阶段提交(Two-phaseCommit)是指,为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种算法(Algorithm),通常二阶段提交也被称为是一种协议(2)二阶段算法思路: 参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。(3)协议假设

  • 在分布式系统中,存在一个节点作为协调者,则其他节点作为参与者,且各个节点之间可以进行网络通讯。
  • 所有节点都采用预写式日志,切日志被写入后即被保持在可靠的存储设备上,即使节点损坏不会导致日志数据的消失。
  • 所有节点不会永久损失,即使损坏后任然可以恢复。 参与者与协调者之间的关系如图:
  • (4)第一阶段(提交请求阶段)
  1. 协调者节点向所有参与者节点询问是否可以执行提交操作,并开始等待各参与者节点的响应。
  2. 参与者节点执行询问发起为止的所有事务操作,并将信息写入日志。
  3. 各参与者节点响应协调者节点发起的询问。如果参与者节点的事务操作实际执行成功,则它返回一个"同意"消息;如果参与者节点的事务操作实际执行失败,则它返回一个"中止"消息。

(5)第二阶段(提交执行阶段)

  • 成功:

当协调者节点从所有参与者节点获得的相应消息都为"同意"时:

  1. 协调者节点向所有参与者节点发出"正式提交"的请求。
  2. 参与者节点正式完成操作,并释放在整个事务期间内占用的资源。
  3. 参与者节点向协调者节点发送"完成"消息。
  4. 协调者节点收到所有参与者节点反馈的"完成"消息后,完成事务。
  • 失败

如果任一参与者节点在第一阶段返回的响应消息为"终止",或者 协调者节点在第一阶段的询问超时之前无法获取所有参与者节点的响应消息时:

  1. 协调者节点向所有参与者节点发出"回滚操作"的请求。
  2. 参与者节点利用之前写入的日志信息执行回滚,并释放在整个事务期间内占用的资源。
  3. 参与者节点向协调者节点发送"回滚完成"消息。
  4. 协调者节点收到所有参与者节点反馈的"回滚完成"消息后,取消事务。

(6)用事务来解释二阶段所谓的二阶段时将提交过程分为两个阶段:

  • 1.准备阶段
  • 2.提交阶段

(7)JTA(Java Transaction API)与atomikos实现分布式事务主要代码如下:

  • 1> 配置数据源: DruidXADataSource 连接池实现了XAResource接口用来进行对资源操作
@Bean(name = "systemDataSource")@Primarypublic DataSource systemDataSource(){  AtomikosDataSourceBean ds = new AtomikosDataSourceBean();  ds.setXaProperties(PojoUtil.obj2Properties(postgreSqlProperties));  ds.setXaDataSourceClassName("com.alibaba.druid.pool.xa.DruidXADataSource");  ds.setUniqueResourceName("systemDataSource");  ds.setPoolSize(5);  ds.setTestQuery("SELECT 1"); return ds;}复制代码
  • 2> 配置事务: 配置spring的JtaTransactionManager,其底层交给atomikos进行事务处理。
@Bean(name = "transactionManager")@DependsOn({"userTransaction

spring整合atomikos实现分布式事务的方法示例_分布式事务一:基于数据库原生分布式事务方案实现...相关推荐

  1. spring整合atomikos实现分布式事务的方法示例_分布式事务中的XA和JTA

    在介绍这两个概念之前,我们先看看是什么是X/Open DTP模型. X/Open X/Open,即现在的open group,是一个独立的组织,主要负责制定各种行业技术标准.X/Open组织主要由各大 ...

  2. spring整合atomikos实现分布式事务的方法示例_分布式-分布式事务处理

    在之前的文章"如何合理的使用动态数据源"中,其实也提到了分布式事务相关的场景如:利用多数据源实现读写分离,但直接使用动态数据源频繁其实是很消耗资源的,而且就是当业务service一 ...

  3. java方法设置切点_java相关:Spring AOP中定义切点的实现方法示例

    java相关:Spring AOP中定义切点的实现方法示例 发布于 2020-6-6| 复制链接 摘记: 本文实例讲述了Spring AOP中定义切点的实现方法.分享给大家供大家参考,具体如下:一 配 ...

  4. java分布式事务 实例_spring整合atomikos实现分布式事务的方法示例

    前言 Atomikos 是一个为Java平台提供增值服务的并且开源类事务管理器,主要用于处理跨数据库事务,比如某个指令在A库和B库都有写操作,业务上要求A库和B库的写操作要具有原子性,这时候就可以用到 ...

  5. 基于数据库的分布式锁实现

    一.基于数据库表 要实现分布式锁,最简单的方式可能就是直接创建一张锁表,然后通过操作该表中的数据来实现了.当我们要锁住某个方法或资源的时候,我们就在该表中增加一条记录,想要释放锁的时候就删除这条记录. ...

  6. redis延迟队列 实现_灵感来袭,基于Redis的分布式延迟队列(续)

    背景 上一篇(灵感来袭,基于Redis的分布式延迟队列)讲述了基于Java DelayQueue和Redis实现了分布式延迟队列,这种方案实现比较简单,应用于延迟小,消息量不大的场景是没问题的,毕竟J ...

  7. python中使用grpc方法示例_在Python中使用gRPC的方法示例

    本文介绍了在Python中使用gRPC的方法示例,分享给大家,具体如下: 使用Protocol Buffers的跨平台RPC系统. 安装 使用 pip pip install grpcio pip i ...

  8. 抽象工厂和工厂方法示例_工厂方法设计模式示例

    抽象工厂和工厂方法示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此 ...

  9. 抽象工厂和工厂方法示例_抽象工厂设计模式示例

    抽象工厂和工厂方法示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此 ...

最新文章

  1. leetcode 7整数反转和leetcode 9回文数
  2. 【技术系列】浅谈GPU虚拟化技术(第一章)
  3. 安装 VMware Workstation Pro 16 并创建 ubuntu 20.04 虚拟机
  4. fiddler和wireshark工具介绍及对比 - [测试技术知识]
  5. workunit 的指的工作单元是什么_分频器是做什么用的?
  6. collection集合 多少钱_Java集合框架大汇总,建议收藏
  7. HashMap 为什么会导致 CPU 100%?文章看不懂?来看这个视频吧!——面试突击 006 期...
  8. SQLServer复制需要有实际的服务器名称才能连接到服务器,请指定实际的服务器名转...
  9. javascript range 转为 html,javascript Range对象跨浏览器常用操作
  10. markdown模板
  11. NX_UG1872安装
  12. 主成分分析结果成分不显著_spss主成分分析结果解读
  13. Spring Boot 集成Spring Schedule定时任务执行功能(动态修改执行时间)
  14. Centos 8 安装 Openbravo 之安装 httpd mod_jk
  15. 开发一款APP需要多少钱?
  16. virt-manger创建虚拟机及virtio网卡
  17. 认识一下,JavaScript今年25岁啦
  18. 手动爬取炉石传说所有卡牌
  19. 万豪国际成立全球清洁卫生委员会,推行更高标准清洁消毒措施
  20. 下载到的电子书格式是Mobi,这种格式能否在手机上打开?

热门文章

  1. 智能小车二十《摄像头和路由器装上小车》
  2. 5_1 大理石在哪儿(UVa10474)排序与查找
  3. zz从一道笔试题谈算法优化(上)
  4. 尝试使用Microsoft IE 7.0 Beta 1
  5. 图论——最长路(洛谷 P1807)
  6. C语言课后习题(68)
  7. docker可以把应用及其相关的_声学中的相干性及其相关应用!
  8. .net oracle 参数化,.NET参数化Oracle查询参数
  9. 中国信通院发布《数据库发展研究报告(2021年)》(附报告和解读PPT下载)
  10. 另辟蹊径:从其他角度去解决数据库问题