Java面试题总结18之springcloud四种分布式事务解决方案

XA规范:分布式事务规范,规定了分布式事务模型

四个角色:事务管理器(协调者TM),资源管理器(参与者RM),应用程序AP,通信资源管理器CRM

全局事务:一个横跨多个数据库的事务,要么全部提交,要么全部回滚

JTA事务时Java对XA规范的实现,对应JDBC的单库事务

两阶段协议

第一阶段(prepare):每个参与者执行本地但不提交,进入ready状态,并通知协调者已经准备就绪。

第二阶段(commit):但协调者确认每个参与者都ready后,通知参与者进入commit操作,如果有参与者fail,则发送rollback命令,各参与者做回滚。

问题:

单点故障:一旦事务管理器出现故障,整个系统不可用

数据不一致:在阶段二,如果事务管理器只发送了部分commit消息,此时网络发生异常,那么只有部分参与者接受到commit消息,也就是说只有部分参与者提交了事务,使得系统数据不一致。

效应时间较长:参与者和协调者资源都被锁住,提交或者回滚之后才能释放

不确定性:当协事务管理器发送commit之后,并且此时只有一个参与者收到了commit,那么当该参与者与事务管理器同时宕机之后,重新选举的事务管理器无法缺点该条信息是否提交成功

三阶段协议:

针对两阶段的优化,解决了2PC单点故障的问题,但是性能问题和不一致问题仍然没有根本解决

引入了超时机制解决参与者阻塞的问题,超时后本地提交,2pc只有协调者有超时机制
第一阶段:CanCommit阶段,协调者询问事务参与者,是否有能力完成此次事务。如果都返回yes,则进入第二阶段,有一个返回no或等待响应超时,则中断事务,并向所有参与者发送abort请求


第二阶段:PreCommit阶段,此时协调者会向所有的参与者发送PreCommit请求,参与者收到后开始执行事务操作。参与者执行完事务操作后(此时属于未提交事务的状态),就会向协调者反馈"Ack”表示我已经准备好提交了,并等待协调者的下一步指令。


第三阶段:DoCommit阶段,在阶段二中如果所有的参与者节点都返回了Ack,那么协调者就会从“预

提交状态”转变为“提交状态”。然后向所有的参与者节点发送"doCommit"请求,参与者节点在收到

提交请求后就会各自执行事务提交操作,并向协调者节点反馈“Ack”消息,协调者收到所有参与者的Ack消息后完成事务。相
反,如果有一个参与者节点未完成PreCommit的反馈或者反馈超时,那么协调者都会向所有的参与

者节点发送abort请求,从而中断事务。 

TCC(补偿事务)Try,Confirm,Cancel


针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作
Try操作做业务检查及资源预留,Confirm做业务确认操作,Cancel实现一个与Try相反的操作既回

滚操作。TM首先发起所有的分支事务的try操作,任何一个分支事务的try操作执行失败,TM将会发

起所有分支事务的Cancel操作,若try操作全部成功,TM将会发起所有分支事务的Confirm操作,

其中Confirm/Cancel操作若执行失败,TM会进行重试。

TCC模型对业务的侵入性较强,改造的难度较大,每个操作都需要有try、confirm、cancel三个接

口实现confirm 和 cancel接口还必须实现幂等性。

消息队列的事务消息

发送prepare消息到消息中间件

发送成功后,执行本地事务

     (1)如果事务执行成功,则commit,消息中间件将信息下发至消费端(commit前,消息不会被消费)

      (2)如果事务执行失败,则回滚,消息中间件将这条prepare消息删除

消费端收到消息进行消费,如果消费失败,则不断重试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/750451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一款博客网站源码

一款博客网站源码 源码软件库 为大家内置了主题 清爽又强大真正的永久可用的一条源码,该版本为整合版本,内置了Joe主题,搭建后直接启用即可~ 安装环境要求: PHP 7.2 以上 MySQL, PostgreSQL, SQLite 任意一种数据库支持&#xff…

【LeetCode热题100】148. 排序链表(链表)

一.题目要求 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 二.题目难度 中等 三.输入样例 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4] 示例 2: 输入:head [-1,5,3,4,0] 输…

MySQL模块---更新和删除数据

1. 更新数据 // 更新数据 // 要更新的数据 const user { username: aaaaaa777, password: bbb7777, status: 1, id:7} // 要执行的 sql 语句 const sqlStr update users set username?, password?, status? where id? // 调用 db.query() 执行 sql 的同时,使用数组依次为…

【Java基础】IO流(三):字符流的FileReader(文件字符输入流)和 FileWriter(文件字节输出流)

目录 字符流 1、FileReader(字符输入流) 1.1、无参的read( )方法示例 ​编辑 1.2、有参的read(char[ ] buffer)方法示例 2、FileWriter(字符输出流) 字符流 字符流的底层其实就是字节流,即字符流 字节流 字符集…

基于ESTAR指数平滑转换自回归模型的CPI数据统计分析matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 ESTAR模型概述 4.2 WNL值,P值, Q值,12阶ARCH值 4.3ADF检验 5.完整程序 1.程序功能描述 基于ESTAR指数平滑转换自回归模型的CPI数据统计分析matlab仿…

LeetCode Python - 58. 最后一个单词的长度

目录 题目描述解法运行结果 题目描述 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入:s “Hel…

【Vue】Request模块 - axios 封装Vuex的持久化存储

📝个人主页:五敷有你 🔥系列专栏:Vue ⛺️稳中求进,晒太阳 Request模块 - axios 封装 使用axios来请求后端接口,一般会对axios进行一些配置(比如配置基础地址,请求响应拦截器…

HCIP—BGP邻居关系建立实验

BGP的邻居称为:IBGP对等体 EBGP对等体 1.EBGP对等体关系: 位于 不同自治系统 的BGP路由器之间的BGP对等体关系 EBGP对等体一般使用 直连建立 对等体关系,EBGP邻居之间的报文 TTL中值设置为1 两台路由器之间建立EBGP对等体关系&#xff0…

vue3新功能-Teleport

1.teleport 在组件内的任何位置渲染内容 将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去。 例:将组件dialog添加到body下面 <teleport to"body"> <el- dialog --> </teleport> 2.fragments 多个根元素外层不需要…

启智AI协作平台资源调用留档

skywalk163/airoot: 好好学习&#xff0c;天天向上&#xff01; 这是AI学习和实践的基地&#xff01; - airoot - OpenI - 启智AI开源社区提供普惠算力&#xff01; 发现启智AI协作平台修改了资源访问方式&#xff0c;留档以便查找。 为解决平台内各种算力资源环境下模型、数据…

遵循Web标准规范,构建优质网页

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Linux操作系统-汇编LED驱动程序基础

一、汇编LED原理分析 IMX6ULL-LED灯硬件原理分析&#xff1a; 1、使能时钟&#xff0c;CCGR0-CCGR6这7个寄存器控制着IMX6ULL所有外设时钟的使能。为了简单&#xff0c;设置CCGR0-CCGR6这7个寄存器全部为0XFFFFFFFF&#xff0c;相当于使能全部外设时钟。&#xff08;在IMX6ULL芯…

【Flink SQL】Flink SQL 基础概念(三):SQL 动态表 连续查询

《Flink SQL 基础概念》系列&#xff0c;共包含以下 5 篇文章&#xff1a; Flink SQL 基础概念&#xff08;一&#xff09;&#xff1a;SQL & Table 运行环境、基本概念及常用 APIFlink SQL 基础概念&#xff08;二&#xff09;&#xff1a;数据类型Flink SQL 基础概念&am…

大数据平台测试-我是怎么面试高级测试的

前言 下面是我面试时会问的一些问题整体提问思路&#xff1a;接口自动化框架->UI 自动化框架->测试用例设计思维->Linux->SQL->Python->常用算法和数据结构->Shell 脚本->jmeter->Docker->Jenkins 重点还是 UI、接口自动化等方面的技能&#xf…

简述从浏览器发出请求到数据返回的全过程

下面是我结合经验概述的从浏览器发出请求到数据返回的全过程。 一、用户请求 1、用户在浏览器输入URL&#xff0c;或通过功能发起请求&#xff1b; 2、解析URL&#xff0c;提取协议(http,https等)&#xff0c;IP&#xff0c;端口&#xff0c;域名&#xff0c;路径等信息&#x…

CSS学习(2)-盒子模型

1. CSS 长度单位 px &#xff1a;像素。em &#xff1a;相对元素 font-size 的倍数。rem &#xff1a;相对根字体大小&#xff0c;html标签就是根。% &#xff1a;相对父元素计算。 注意&#xff1a; CSS 中设置长度&#xff0c;必须加单位&#xff0c;否则样式无效&#xff…

Vue2(二):计算属性、监视属性、二者的区别

一、计算属性 1. 使用插值语法和methods拼接姓名 如果样式要求不多的话这样写没问题&#xff0c;如下代码是截取我输入的姓的前三个字母 <div id"root">姓&#xff1a;<input type"text" v-moudel"firstName">名&#xff1a;<…

Unity2019.2.x 导出apk 安装到安卓Android12+及以上的系统版本 安装出现-108 安装包似乎无效的解决办法

Unity2019.2.x 导出apk 安装到安卓Android12及以上的系统版本 安装出现-108 安装包似乎无效的解决办法 导出AndroidStudio工程后 需要设置 build.gradle文件 // GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAINbuildscript {repositor…

MySQL的目录结构

安装目录 /usr/local/mysql数据目录 /usr/local/mysql/data配置目录 /usr/local/etc/my.cnf

第二十四章 Web Gateway 管理页面概述

文章目录 第二十四章 Web Gateway 管理页面概述访问Web网关管理页面启用从其他客户端地址的访问 第二十四章 Web Gateway 管理页面概述 Web Gateway 提供了一组管理页面&#xff0c;可以使用它们来配置和监视 Web Gateway。本页介绍如何访问这些页面以及如何本地化它们&#x…