spring alibaba中的seata分布式事务
Seata AT 模式设计思路
一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
核心在于对业务sql进行解决解析,转换成undolog,并同时入库存
二阶段:
提交异步化,非常快速地完成,则Tc通知RM异步删除undolog;
回滚一阶段日志进行反向补偿,tm向tc发送回滚请求,RM收一协调器TC发来的回滚请求,通过XID和Branch ID找到相应的回滚日志记录,通过回滚记录生成反向的更新sql并执行,以完成分支的回滚
两阶段提交协议(2PC)
阶段1:TM(事务管理器)通知各个RM(资源管理器)准备提交它们的事务分支
阶段2:TM 根据阶段1各个RM prepare的结果,决定是提交还是回滚事务。如果所有的RM都prepare成功,那么TM通知所有的RM进行提交;如果有RM prepare失败的话,则TM通知所有RM回滚自己的事务分支。
存在的问题:
- 同步阻塞问题
- 单点故障
- 数据不一致
XA模式
执行阶段:
可回滚:业务SQL操作放在XA分支中进行,由资源对XA协议来保证可回滚
持久化:XA分支完成后,执行XA prepare,同样,由资源对XA协议的来支持来保证持久化
完成阶段:
分支提交:执行XA分支的commit
分支回滚:执行XA分支的rollback
TCC模式
tcc基于分布式事务中的二阶段提交协议实现,这化的全称为Try-Confirm-Cancel,即资源预留(Try)、确认操作(Confirm)、取消操作(Cancel),他们的具体含义如下:
- Try:对业务资源的检查并预留
- Confirm:对业务处理进行提交,即commit操作,只要Try成功,那么该步骤一定成功
- Cancel:对业务处理进行取消,即回滚操作,该步骤回对Try预留的资源进行释放。
TCC是一种侵入式的分布式事务解决方案,对业务系统有着非常大的入侵性,设计相对复杂
优点:TCC完全不依赖数据库,能够实现跨数据库、跨应用资源管理
Seata如何防止空回滚,新增一个TCC事务控制表
如何处理幂等,幂等问题指的是 TC 重复进行二阶段提交,因此 Confirm/Cancel 接口需要支持幂等处理,即不会产生资源重复提交或者重复释放。
如何处理悬挂,在 TCC 事务控制表记录状态的字段 status 中增加一个状态: 当执行二阶段 Cancel 方法时,如果发现 TCC 事务控制表没有相关记录,说明二阶段 Cancel 方法优 先一阶段 Try 方法执行,因此插入一条 status=4 状态的记录,当一阶段 Try 方法后面执行时,判断 status=4 ,则说明有二阶段 Cancel 已执行,并返回 false 以阻止一阶段 Try 方法执行成功
XA与TCC比较
- XA是资源层面的分布式事务,强一致性,在两阶段提交的整个过程中,一直会持有资源的锁。
- TCC是业务层面的分布式事务,最终一致性,不会一直持有资源的锁
AT模式与TCC模式比较
区别在于:
AT模式基于支持本地ACID事务的关系型库数据
一阶段prepare行为:在本地事务中,一并提交业务数据更新和相应回滚日志记录
二阶段commit行为:马上成功结束,自动异步批量清理回滚日志
二阶段rollback行为:通过回滚日志,自动生成补偿操作,完成数据回滚
相应用的,TCC模式不依赖于底层数据资源的事务支持:
一阶段prepare行为:调用自prepare逻辑
二阶段commit行为:调用自定义的commit逻辑
二阶段rollback行为:调用自定义的rollback逻辑。
简单点概括,SEATA的TCC模式就是手工的AT的模式,它允许你自定义两阶段的处理逻辑而不依赖AT模式的undo_log
可靠消息最终一致性
异步化在分布式系统设计中随处可见,基于消息队列的最终一致性就是一种异步事务机制,在业务中广泛应用。
本地消息表
将分布式事务拆分成本地事务进行处理,通过消息日志的方式来异步执行。本地消息表是一种业务耦合的设计,消息生产方需要额外建一个事务消息表,并记录消息发送状态,消息消费方需要处理这个消息,并完成自己的业务逻辑,另外会有一个异步机制来定期扫描未完成的消息,确保最终一致性。
RocketMQ事务消息
RocketMQ事务消息是一种支持分布式事务的消息。它通过引入prepare、commit和rollback三个阶段,来确保事务消息的一致性。
- Prepare阶段:消息发送方发送消息,此时消息的状态为“待提交”
- commit阶段:消息发送方向RocketMQ发送commit消息请求,RocketMQ判断此时半消息是否被确认,如果半消息已被确认,则将消息标记为“可消费”并提交事务。如果半消息未被确认,刚将消息标记为“不可消息”并终止事务。
- rollback阶段:消息发送方向rocketMQ发送rollback消息请求,RocketMQ将半消息标记为“不可消费”并回滚事务。
最大努力通知
最大努力通知型是最简单的一种柔性事务,适用于一些最终一致性时间敏感度低的业务,且被动方处理不影响主动方的处理结果。
最大努力通知实施方案,一般符合以下特点:
- 不可靠消息:业务活动主动方,在完成业务处理之后,向业务活动的被动方发送消息,直到通知N次后不再通知,允许消息丢失(不可靠消息)
- 定期校对:业务活动的被动方,根据定时策略,向业务活动主动方查询(主动方提供查询接口),恢复丢失的业务消息
相关文章:
spring alibaba中的seata分布式事务
Seata AT 模式设计思路 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。 核心在于对业务sql进行解决解析,转换成undolog,并同时入库存 二阶段: 提交异步化,非常快速地完成…...

MQTT学习(二)
订阅主题和订阅确认 SUBSCRIBE——订阅主题 之前的CONNECT报文,分为 固定报头:必须存在,用于描述报文信息。里面有指出什么类型的报文,报文的等级。可变报头:不一定存在。主要看什么样子类型的报文。有效载荷部分&a…...
入职Java,不会git被开除了。。。
入职Java,不会git被开除了。。。 文章目录 入职Java,不会git被开除了。。。前言一、Git是什么?二、Git的核心概念三、Git的工作流程四、Git的常用命令五、总结 🌈你好呀!我是 山顶风景独好 💝欢迎来到我的博…...
Mysql 隔离级别
MySQL的事务隔离级别是指在处理并发事务时,为保证数据的一致性和事务的独立性,数据库系统提供的不同级别控制策略。根据ACID特性中的隔离性(Isolation),MySQL支持四种标准的事务隔离级别,每种级别有不同的并…...

每日一学—K邻算法:在风险传导中的创新应用与实践价值
文章目录 📋 前言🎯 K邻算法的实践意义🎯 创新应用与案例分析🔥 参与方式 📋 前言 在当今工业领域,图思维方式与图数据技术的应用日益广泛,成为图数据探索、挖掘与应用的坚实基础。本文旨在分享…...

基于Springboot的校园疫情防控信息管理系统(有报告)。Javaee项目,springboot项目。
演示视频: 基于Springboot的校园疫情防控信息管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层…...

【C++】内联函数、auto、范围for
文章目录 1.内联函数2.auto关键字2.1auto简介2.2auto的注意事项2.3auto不能推导的场景 3.基于范围的for循环(C11)4.指针空值nullptr(C11) 1.内联函数 概念: 以inline修饰的函数叫做内联函数,编译时C编译器会在调用内联函数的地方展开,没有函…...

Day 46 139.单词拆分
单词拆分 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明: 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1: 输入: s “leet…...
streamlit报错:AxiosError: Request failed with status code 403
解决办法: 步骤一:创建config.toml vi ~/.streamlit/config.toml 步骤二:加入以下内容 [server] enableXsrfProtection false enableCORS false步骤三:重新启动你的streamlit网页...
java基础教学 |Java Stream API详解
Java Stream API 是Java 8引入的一个重要特性,它为集合对象提供了一种新的计算模型,使得开发者能够以声明性的方式处理数据集合。Stream API 不仅提高了代码的可读性和简洁性,还极大地优化了并行处理能力,让复杂的集合操作变得高效…...
0.0和0.00竟然不相等!!!BigDecimal别用错了比较方式
对于BigDecimal字段,可以使用compareTo()方法和equals()方法进行比较。但是要注意这两种方法的作用有所不同。一般都应该使用BigDecimal比较值,而不是使用经常用到的equals方法比较内容。 1.compareTo()方法 是用来比较两个BigDecimal对象的大小关系。…...

【多模态】30、Monkey | 支持大尺寸图像输入的多任务多模态大模型
文章目录 一、背景二、方法2.1 Enhancing Input Resolution2.2 Multi-level Description Generation2.3 Multi-task Training 三、效果3.1 Image Caption3.2 General VQA3.3 Scene Text-centric VQA3.4 Document-oriented VQA3.5 消融实验3.6 可视化 论文:Monkey : …...

PHP黑魔法之md5绕过
php本身是一种弱语言,这个特性决定了它的两个特点: 输入的参数都是当作字符串处理变量类型不需要声明,大部分时候都是通过函数进行类型转化php中的判断有两种: 松散比较:只需要值相同即可,类型不必相同,不通类型比较会先转化为同类型,比如全数字字符串和数字比较,会比…...

【适用全主题】WordPress原创插件:弹窗通知插件 支持内容自定义
内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 适用于所有WordPress主题的弹窗插件 一款WordPress原创插件:弹窗通知插件 支持内容自定义 二、效果展示 1.部分代码 代码如下(示例)࿱…...

定时器的理论和使用
文章目录 一、定时器理论1.1定时器创建和使用 二、定时器实践2.1周期触发定时器2.2按键消抖 一、定时器理论 定时器是一种允许在特定时间间隔后或在将来的某个时间点调用回调函数的机制。对于需要周期性任务或延迟执行任务的嵌入式应用程序特别有用。 软件定时器: …...

【架构-17】通信系统架构设计理论
通信系统网络架构 1. 局域网网络架构 拓扑结构:星型、总线型、环型、树型。 网络架构:单核心架构(结构简单,地理范围受限)、双核心架构(网络拓扑结构可靠,投资较单核高)、环型架构…...

网络中的基本概念
网络初识 局域网:把若干个电脑组成在一起,通过路由器进行组网。 广域网:把局域网进一步的连接,构成更复杂的网络体系。 IP地址:区分主机。 端口号:区分主机上不同的程序。 协议:是一种约定&…...

手撸XXL-JOB(二)——定时任务管理
在上一节中,我们介绍了SpringBoot中关于定时任务的执行方式,以及ScheduledExecutorService接口提供的定时任务执行方法。假设我们现在要写类似XXL-JOB这样的任务调度平台,那么,对于任务的管理,是尤为重要的。接下来我们…...

DEV--C++小游戏(吃星星(0.2))
目录 吃星星(0.2) 简介 本次更新 分部代码 头文件(增) 命名空间变量(增) 副函数(新,增) 清屏函数 打印地图函数(增) 移动函数 选择颜色…...
Lua 协程池
协程池 在 使用 Lua 协程模拟 Golang 的 go defer 编程模式 中介绍了 Lua 协程的使用,模仿 golang 封装了下 还可以做进一步的优化 原来的 go 函数是这样实现的: function go(_co_task)local co coroutine.create(function(_co_wrap)_co_task(_co_w…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...