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

news2025/2/24 18:10:55

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.coloradmin.cn/o/1529106.html

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

相关文章

微信小程序小白易入门基础教程1

微信小程序 基本结构 页面配置 页面配置 app.json 中的部分配置,也支持对单个页面进行配置,可以在页面对应的 .json 文件来对本页面的表现进行配置。 页面中配置项在当前页面会覆盖 app.json 中相同的配置项(样式相关的配置项属于 app.js…

QML | JavaScript作用域和命名解析

#1 JavaScript作用域和命名解析 QML属性绑定、内联函数和导人的JavaScript文件都运行在一个JavaScript作用域中。作用域主要控制两点:一是表达式可以访问哪些变量;二是当两个或多个名字冲突时,哪个变量优先。由于JavaScript的内建作用域机制非常简单,QML对其进行了加强,使…

java实现kml文件下载接口

根据业务需求,需提供一个下载kml格式航线文件的HTTP GET接口 示例代码 package com.kyrielx.kmzdemo.controller;import org.apache.commons.io.FileUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org…

3/13/24运算符、补码、整型、浮点型、汇编

目录 三目运算符 逗号运算符 自增自减运算符 位运算 运算符优先级 补码讲解 整型解析 溢出解析 浮点数IEEE754标准解析 浮点数精度丢失 真题 汇编指令 生成汇编方法 常用指令 三目运算符 条件运算符是C语言中唯一的三目运算符。通过判断问号之前的表达式的真假&…

linux之权限管理和组

一,ACL权限 1.1,什么是acl权限? ACL是Access Control List的缩写,即访问控制列表。可以通过下列的实例来理解ACL的作用: 思考如何实现如下的权限控制: 每个项目成员在有一个自己的项目目录,…

网工内推 | 信息安全主管,CISP认证优先,最高25K,加绩效提成

01 福建省数字福建云计算运营有限公司 招聘岗位:网络及信息安全主管 职责描述: 1.负责带领IT运维团队,对公司网络与安全整体架构规划,设计、运营及IT设备的全生命周期运维规划等; 2.负责对网络、网络安全的日常运维管…

【JavaScript】JavaScript 程序流程控制 ① ( 顺序流程控制 | 分支流程控制 )

文章目录 一、JavaScript 程序流程控制简介1、顺序流程控制2、分支流程控制3、分支流程控制 - 代码示例 一、JavaScript 程序流程控制简介 JavaScript 程序 执行过程中 , 不同的代码执行顺序 , 得到的结果是不同的 , 在编程中 经常 需要 根据 不同的条件 执行不同的代码块 , 或…

计算机缺失msvcp110.dll如何修复,多种修复方法教给你

当电脑系统中msvcp110.dll文件丢失时,可能会对计算机的正常运行产生一系列显著的影响。msvcp110.dll是Microsoft Visual C Redistributable Package的一部分,这个动态链接库文件对于许多基于Windows的应用程序至关重要,尤其是一些使用C编译器…

2024蓝桥杯每日一题(回溯)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一:木棒 试题二:n皇后问题 试题三:糖果 试题四:飞机降落 试题五:生日蛋糕 试题一:木棒 【问题描述】 乔治拿来一组等长…

【工具】Mermaid + 大模型画流程图

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 引入使用画TCP三次握手了解历史人物 总结 引入 最近看面试文章关于TCP三次握手和…

PTA L2-021 点赞狂魔

微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。然而有这么一种人,他们会通过给自己看到的一切内容点赞来狂刷存在感,这…

好委屈,东方甄选为何总是被供应商骗?

东方甄选最近很委屈。 315晚会过后,知名打假人王海爆料,称315晚会曝光的槽头肉扣肉在东方甄选和小杨哥的直播间里销售过。 东方甄选赶忙去问了问供应商情况。 供应商的回答让他感到暖心,表示虽然315晚会曝光了我们公司违规使用糟头肉&…

Pulsar IO实战

一、引言 今天跟着 官方文档 基于docker玩一把Pulsar IO吧 二、概要 在用户能够轻松的将消息队列跟其他系统(数据库、其他消息系统)一起使用时,消息队列的作用才是最强大的。而Pulsar IO connectors可以让你很轻松的创建、部署以及管理这些跟外部系统的连接&#…

Golang 开发实战day04 - Standard Library

Golang 开发实战day04 - Standard Library 接下来开始我们第四天学习,Go语言标准库提供了丰富的功能,可以帮助开发者快速完成各种任务。 golang就像其他语言一样,附带了一些非常轻量级的函数和特性,都是开箱即用的,这里…

KMM初探

什么是KMM? 在开始使用 KMM 之前,您需要了解 Kotlin。 KMM 全称:Kotlin Multiplatform Mobile)是一个用于跨平台移动开发的 SDK,相比于其他跨平台框架,KMM是原生UI逻辑共享的理念,由KMM封装成Android(Kotlin/JVM)的aar…

第四百一十一回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"给geolocator插件提交问题的结果"相关的内容,本章回中将介绍自定义标题栏.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我…

第四百一十二回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"给geolocator插件提交问题的结果"相关的内容,本章回中将介绍自定义标题栏.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我…

我的自建博客之旅04之Halo

我的自建博客之旅04之Halo Halo是我无意间发现的一款博客框架,如果你讨厌Hexo,Vuepress等静态框架本地编辑,构建部署等方式,如果你想要一款一次搭建,前台是博客,后台是文章维护,并且支持各种定制化折腾的博客框架,可能Halo会比较适合你。 因为我个人还是比较偏技术,…

八节【DBA从入门到实践】课程,带你快速掌握OceanBase运维管理核心技能

为帮助用户及开发者更好、更快地掌握OceanBase DBA核心技能,OceanBase社区设计了配套教程——“DBA从入门到实践”。8期教程带大家循序渐进掌握OceanBase运维管理核心技能。搭配随堂习题和OceanBase技术专家在线答疑,快速掌握重要知识点,并轻…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Refresh)

可以进行页面下拉操作并显示刷新动效的容器组件。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 从API version 11开始,Refresh子组件会跟随手势下拉而下移…