分布式事务篇

点赞再看,养成习惯,微信搜索「 小大白日志」关注这个搬砖人。

文章不定期同步公众号,还有各种一线大厂面试原题、我的学习系列笔记。

分布式事务的四种处理措施

在分布式系统中实现分布式事务,它有多个本地事务组成。事务一般遵守ACID(原子性、一致性、隔离性、持久性),但分布式事务很难ACID都满足。一般实现分布式事务有4种方法:2PC、TCC、本地消息表、RocketMQ消息事务

2PC
  • 定义:顾名思义,这个过程有两步=P+C:做一些准备工作来锁定资源,除了提交事务之外啥事都做了(P)->提交或者回滚事务(C);

一般会有一个事务协调者、多个事务参与者,首先事务协调者会群发”准备命令”给各个事务参与者,各个事务参与者除了”commit”命令之外准备工作都做完了,然后发送”准备成功”给事务协调者 -> 事务协调者群发”commit”命令让每个事务参与者提交各自本地的事务;

  • 特点:
  • 假如在第一阶段就有参与者返回”准备失败”,则协调者群发”回滚”命令让各参与者回滚;
  • 假如第二阶段失败了(1)如果是某个参与者”commit”失败,则不断重试直到成功(2)如果是某个参与者”回滚”失败,也是不断重试
  • 假如协调者很久没收到某个参与者的”准备成功”命令,则等待一定的时间后就认为该参与者准备失败,群发”回滚”命令让其他参与者回滚操作
  • 弊端:各个事务参与者做完准备工作之后必须阻塞等待其他参与者完成才能”commit”;系统对事务协调者依赖过大,一旦协调者发生故障不能用,那么整个系统分布式事务将不可用

分布式事务篇
TCC
  • 定义:T=try=预留资源,C=confirm=预留资源成功则提交事务,C=cancel=预留资源失败则回滚事务;TCC方案有一个事务协调者(和2PC一样)、多个’TCC服务’,一个事务协调者协调多个’TCC服务’的事务提交和回滚,所以每个’TCC服务’都要实现try/confirm/cancel方法;首先事务协调者会调用所有’TCC服务’的try方法去预留资源,所有’TCC服务’预留成功则返回成功标识,事务协调者再调用所有’TCC服务’的confirm方法提交事务,若有一个’TCC服务’预留失败则调用cancel回滚事务,如下:

分布式事务篇
  • 特点:
  • 允许空回滚:事务协调者发出的try指令由于网络原因而丢包,进而触发cancel指令,那么各’TCC服务方’就只会收到cancel指令而造成空回滚,所以’TCC服务方’应该支持空回滚,如下
    分布式事务篇
  • 防悬挂控制:事务协调者发出的try指令由于网络原因一直未到达各个’TCC服务方’,从而事务协调者一直未收到响应而触发了cancel回滚指令,此时’TCC服务方’先收到cancel指令执行了空回滚,而后收到延迟的try指令,但’TCC服务方’应该拒绝延迟的try指令,如下
    分布式事务篇
本地消息表

假如现在有两个业务操作需要执行,在本地消息表中有一条对应的消息状态代表它们是否都执行成功:第一个业务操作之后,接着执行下一个业务操作,如果下一个业务操作成功,则返回结果给第一个业务去修改它们对应的某条消息状态为’成功’;如果第一个或下一个业务操作失败,则它们对应本地消息表中的某条消息状态改为’失败’;对于本地消息表中失败状态的消息,会有定时器去定时扫描它们并重新发起对应的业务操作

RocketMQ消息事务

有一个发送方会提前发送一个’半消息’给RocketMQ的broker(负责消息的接收、存储、发送),broker接到后返回成功标识给发送方,然后发送方执行本地事务,执行成功再发送commit给broker,然后订阅方从broker中读到commit命令代表执行完自身的业务后可以提交自身事务,提交完再回头消费这条’commit命令消息’;如果发送方执行本地事务失败则发送rollback给broker,’rollback命令’和’半消息’对订阅者都是不可见的,订阅方都收不到这两种消息,也就不需要往下执行订阅方自身的事务;另外发送方需要提供一个反查询事务接口给RocketMQ的broker,以便broker在持续没有收到发送方的commit/rollback命令时,可以反查询出发送方的事务执行结果进而判断是否向订阅者提供’commit命令消息’

OK,如果文章哪里有错误或不足,欢迎各位留言。

创作不易,各位的「 三连」是二少创作的最大动力!我们下期见!

Original: https://www.cnblogs.com/mofes/p/15192266.html
Author: 明天喝可乐
Title: 分布式事务篇

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/589745/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 3、元注解,自定义注解

    元注解 元注解的作用就是负责注解其他注解Java 定义了4 个标准的meta-annotation 类型, 他们被用来提供对其他annotation 类型作说明 这些类型和它们所支…

    Java 2023年6月8日
    089
  • 《HDFS源码剖析》–初品ing

    HDFS概述 ​ HDFS是Hadoop 分布式文件系统,可以运行在通用硬件上、提供流式数据操作、能够处理超大文件的分布式文件系统。HDFS具有高度容错、高吞吐量、容易扩展、高可靠…

    Java 2023年6月8日
    070
  • Java反射

    用来动态的操纵Java代码 反射机制的主要作用: 在运行时分析类的能力 在运行时查看对象 实现通用的数组操作代码 利用Method对象 Class类 在Java程序运行时,系统为所…

    Java 2023年6月13日
    083
  • Arthas之实例操作

    Arthas之实例操作 1. 静态类属性操作 获取public静态属性 ognl -c 7cd84586 ‘@com.system.framework.ArtahsDemoClas…

    Java 2023年6月13日
    090
  • Drools 规则引擎应用 看这一篇就够了

    1 .场景 1.1需求 商城系统消费赠送积分 100元以下, 不加分 100元-500元 加100分 500元-1000元 加500分 1000元 以上 加1000分 ………

    Java 2023年6月7日
    072
  • Java数据类型 方法 递归调用

    1.基础数据结构 java的基本数据类型有8种,包括6种数字类型、1种字符类型、1种布尔类型。 数字类型 4种 整数类型 byte/ short/ int/ long 2种 浮点数…

    Java 2023年6月9日
    093
  • 什么是最左匹配原则?

    什么是最左匹配原则? 什么是最左匹配原则?如果 SQL 语句中用到了组合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个组合索引去进行匹配。当遇到范围查询(>、 O…

    Java 2023年6月5日
    066
  • 力扣刷题2-13. 罗马数字转整数

    罗马数字转整数 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M …

    Java 2023年6月13日
    081
  • Dapr 长程测试和混沌测试

    所测试应用程序将模拟在社交网络中发布的消息,以便通过情绪分析进行评分。不采用外部依赖来更好地控制环境。可以删除某些组件,并实现相同的结果。另一方面,这个测试设计是有意地执行Dapr…

    Java 2023年6月5日
    081
  • 关于 cannot create Parameters: [] 报错问题的解决方法

    其实在Sort类中添加无参构造就可以解决 我自己写的是Sort类,其它情况得视你们自己写的类决定 至于为什么也不是很清楚 Original: https://www.cnblogs…

    Java 2023年6月6日
    085
  • VueCLI使用

    怎样使用 @vue/cli创建并开发一个项目 不想每次都去翻视频,所以自己记录下 文章适用范围:使用纯粹的JavaScript进行开发的Vue项目 安装@vue/cli vue项目…

    Java 2023年6月7日
    088
  • java list的六种赋值方式

    java;gutter:true;public static void main(String[] args) { //第一种赋值 List list1 = Arrays.asLi…

    Java 2023年5月29日
    0106
  • javaWeb

    B/S和C/S C/S架构的程序: B/S架构的程序: Web服务器 对外提供web服务的软件。 我们要使用的web服务器: tomcat 不要钱。 nginx 并发处理能力特强。…

    Java 2023年6月7日
    0110
  • Atitit layout art 布局的艺术目录1. SpringLayout 类 弹簧布局管理器 12. BoxLayout( html默认布局) 11.SpringLayout

    Atitit layout art 布局的艺术 1. SpringLayout 类 弹簧布局管理器 2. BoxLayout( html默认布局) 由 SpringLayout 类…

    Java 2023年5月29日
    076
  • 实现cookie跨域访问

    通过HTML SCRIPT标签跨域写cookie: 由于html的script标签的src属性,可以支持访问任何域的资源,通过script发起一个get类型的网络请求,获取资源。 …

    Java 2023年6月7日
    071
  • Mysql索引学习笔记

    https://www.jianshu.com/p/ace3cd6526c4 推荐up主https://space…

    Java 2023年6月14日
    0176
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球