分布式事务seata
1.事务的4大基本特征。
1)原子性
2)一致性
3)隔离性
4)持久性
2.什么是分布式事务?
本地事务:单服务进程,单数据库资源,同一个连接conn多个事务操作。
分布式事务:多服务进程,多数据库资源(多个conn)。
3.seata_AT模式的工作流程。

TC (Transaction Coordinator) - 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
4.seata整体机制(分成两阶段)
两阶段提交协议的演变:
一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
二阶段:
- 提交异步化,非常快速地完成。
- 回滚通过一阶段的回滚日志进行反向补偿。
一阶段:
在一阶段中,seata会拦截“业务SQL”,首先解析SQL语义,找到要更新的业务数据,在数据被更新前,保存下来“undo”(undo_log日志),然后执行业务SQL更新数据,更新之后再次保存数据“redo”,最后生成行锁(行锁就是针对数据表中行记录的锁),这些操作都在数据库本地事务完成的,这样保证了数据的原子性。(并把本地事务的执行结果(即分支事务回滚的结果)上报给 TC)
二阶段:
负责整体的回滚和提交,如果之前的一阶段中有本地事务没有通过,那么就执行全局回滚,否则在执行全局提交,回滚用到的就是一阶段记录的“undo_log”,通过回滚记录生成反向更新SQL并执行,以完成分支的回滚。当事务完成后会释放所有的资源和删除所有的日志。(提交:如果事务边界没有发生任何异常,全局事务可以提交,TM通知TC进行全局事务的提交,TC释放全局锁,RM删除undo_log日志
回滚:如果事务边界发生任何异常,全局事务必须回滚,TM通知TC全局事务回滚,TC通知RM进行分支事务回滚,分支事务根据undo_log日志反向补偿(必须获取全局锁(全局锁就是对整个数据库实例加锁)))
5.seata(1.4)与springBoot的整合。
store.db.globalTable db模式全局事务表名
store.db.branchTable db模式分支事务表名
store.db.lockTable db模式全局锁表名
@GlobalTransactional
6.seata全局并发事务怎么隔离?
写隔离
- 一阶段本地事务提交前,需要确保先拿到 全局锁 。
- 拿不到 全局锁 ,不能提交本地事务。
- 拿 全局锁 的尝试被限制在一定范围内,超出范围将放弃,并回滚本地事务,释放本地锁。
读隔离
在数据库本地事务隔离级别 读已提交(Read Committed) 或以上的基础上,Seata(AT 模式)的默认全局隔离级别是 读未提交(Read Uncommitted)
7.CAP理论?
所谓CAP理论,说的是在分布式架构下的数据一致性问题和性能问题的平衡方案
C:Consistency 一致性 同一数据的多个副本是否实时相同。
A:Availability 可用性 可用性:一定时间内 & 系统返回一个明确的结果 则称为该系统可用。
P:Partition tolerance 分区容错性 将同一服务分布在多个系统中,从而保证某一个系统宕机,仍然有其他系统提供相同的服务。
在互联网行业竞争激烈的今天,相同领域的竞争者不甚枚举,系统的间歇性不可用会立马导致用户流向竞争对手。因此,我们只能通过牺牲一致性来换取系统的可用性和分区容错。
所以这才有了Zookeeper(cp)中的基于少数服从多数的2pc落地方案。因此,也引出了另外一个理论,叫Base理论。
8.Base理论?
CAP理论告诉我们一个悲惨但不得不接受的事实——我们只能在C、A、P中选择两个条件。而对于业务系统而言,我们往往选择牺牲一致性来换取系统的可用性和分区容错性。不过这里要指出的是,所谓的“牺牲一致性”并不是完全放弃数据一致性,而是牺牲强一致性换取弱一致性
BA:Basic Available 基本可用
S:Soft State:柔性状态 同一数据的不同副本的状态,可以不需要实时一致
E:Eventual Consisstency:最终一致性 同一数据的不同副本的状态,可以不需要实时一致,但一定要保证经过一定时间后仍然是一致的。
基于可靠性消息的最终一致性方案:
可靠性消息最终一致性方案,是指在多个事务中,当前事务发起方执行完本地事务后,发送一条数据同步消息给到事务参与方。
基于可靠性消息队列,需要保证这个消息一定能够被其他事务参与方接收并执行成功,从而实现多个事务参与者之间的数据最终一致性。
实现原理如下图所示:

这个方案存在两个问题:
1.本地事务与消息发送的原子性问题
-

- 解决方案:

基于本地消息表实现重发
本地消息表这个方案最初是 eBay提出的,此方案的核心是通过本地事务保证数据业务操作和
消息的一致性,然后通过定时任务将消息发送至消息中间件,待确认消息发送给消费方成功再
将消息删除。
下面以注册送积分为例来说明:下例共有两个微服务交互,用户服务和积分服务,用户服务负
责添加用户,积分服务负责增加积分。

- 2.事务参与方接收消息的可靠性
-

- 3.消息重复消费的问题
消息重复投递的幂等性保障!
在可靠性消息投递过程中,由于MQ的重试机制,有可能会出现消费者重复收到同一个消息的情
况。
因此,我们需要保证消息投递的幂等性,所谓的幂等性,就是MQ重复调用多次产生的业务结果
与调用一次产生的业务结果相同;
- 数据库唯一约束实现幂等
- 通过tokenid的方式去识别每次请求判断是否重复
- redis中的setNX
- 状态机幂等性
- 本地消息表生成md5实现唯一约束
-


RocketMQ的本地事务:

9.TCC的模式?
TCC事务解决方案
TCC的方案,在电商、金融领域落地也比较多,他是一种两阶段提交的基于应用层的改进方案。TCC将整个业务逻辑的每个分支分成了Try、Confirm、Cancel三个操作,try部分完成业务的准备工作, confirm部分完成业务的提交、cancel部分完成事务的回滚。
TCC事务解决方案本质上是一种补偿的思路,它把事务运行过程分成Try、Confirm/cancel两个阶段,每个阶段由业务代码控制,这样事务的锁力度可以完全自由控制。
需要注意的是,TCC事务和2pc的思想类似,但并不是2pc的实现,TCC不再是两阶段提交,而只是它对事务的提交/回滚是通过执行一段confirm/cancel业务逻辑来实现,并且也并没有
全局事务来把控整个事务逻辑。


分布式事务seata的更多相关文章
- 阿里分布式事务seata入门(采坑)
1. 阿里分布式事务seata入门(采坑) 1.1. 前言 seata是feascar改名而来,这是阿里在19年年初开源出来的分布式事务框架,当初刚出来的时候就想研究下了,一直拖到了现在,目前是0.8 ...
- SpringCloud系列之集成分布式事务Seata应用篇
目录 前言 项目版本 项目说明 Seata服务端部署 Seata客户端集成 cloud-web module-order module-cart module-goods module-wallet ...
- 分布式事务 Seata Saga 模式首秀以及三种模式详解 | Meetup#3 回顾
https://mp.weixin.qq.com/s/67NvEVljnU-0-6rb7MWpGw 分布式事务 Seata Saga 模式首秀以及三种模式详解 | Meetup#3 回顾 原创 蚂蚁金 ...
- 分布式事务(Seata)原理 详解篇,建议收藏
前言 在之前的系列中,我们讲解了关于Seata基本介绍和实际应用,今天带来的这篇,就给大家分析一下Seata的源码是如何一步一步实现的.读源码的时候我们需要俯瞰起全貌,不要去扣一个一个的细节,这样我们 ...
- 出席分布式事务Seata 1.0.0 GA典礼
前言 图中那个红衣服的就是本人 什么是分布式事务 分布式事务就是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上. 简单的说,就是一次大的操作由不同的小 ...
- spring boot:使用分布式事务seata(druid 1.1.23 / seata 1.3.0 / mybatis / spring boot 2.3.2)
一,什么是seata? Seata:Simpe Extensible Autonomous Transcaction Architecture, 是阿里中间件开源的分布式事务解决方案. 前身是阿里的F ...
- 微服务开发的最大痛点-分布式事务SEATA入门简介
前言 在微服务开发中,存在诸多的开发痛点,例如分布式事务.全链路跟踪.限流降级和服务平滑上下线等.而在这其中,分布式事务是最让开发者头痛的.那分布式事务是什么呢? 分布式事务就是指事务的参与者.支持事 ...
- 分布式事务(Seata) 四大模式详解
前言 在上一节中我们讲解了,关于分布式事务和seata的基本介绍和使用,感兴趣的小伙伴可以回顾一下<别再说你不知道分布式事务了!> 最后小农也说了,下期会带给大家关于Seata中关于sea ...
- SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截
项目依赖 SpringBoot 2.5.5 SpringCloud 2020.0.4 Alibaba Spring Cloud 2021.1 Mybatis Plus 3.4.0 Seata 1.4. ...
- spring boot:shardingsphere+druid整合seata分布式事务(spring boot 2.3.3)
一,shardingshpere为什么要整合seata? 分库分表是数据库扩展中最常用的处理方法, shardingshpere作为使用最广泛的分表中间件, 如果不支持分布式事务,则它的数据一致性就会 ...
随机推荐
- 玫瑰花变蚊子血,自动化无痕浏览器对比测试,新贵PlayWright Vs 老牌Selenium,基于Python3.10
也许每一个男子全都有过这样的两个女人,至少两个.娶了红玫瑰,久而久之,红的变了墙上的一抹蚊子血,白的还是床前明月光:娶了白玫瑰,白的便是衣服上沾的一粒饭黏子,红的却是心口上一颗朱砂痣.--张爱玲< ...
- Vulhub 漏洞学习之:Redis
Vulhub 漏洞学习之:Redis 1 Redis简介 Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库.Redis 与其他 key - value 缓存产品 ...
- 通过 Blob 创建下载文件
Blob 如上图所示,Blob 对象有三个部分组成,data:image/jpeg 表示该 Blob 是什么类型的文件.base64 是一个二进制到文本的编码,更多细节查看Base64 编码/解码.其 ...
- Collection集合类(Java)
Collection集合体系 1,Collection集合分为两大类List集合和Set集合 List系列集合特点: 有序,可重复,有索引 ArrayList:有序,可重复,有索引. LinkedLi ...
- AI绘画--tag资源
tag生成器:https://wolfchen.top/tag/ 资源整合表:https://wolfchen.top/tag/doc.html 魔咒百科词典:https://aitag.top/ N ...
- left join(二)
left join 通俗的解释:以左表为主表,返回左表的所有行,如果右表中没有匹配,则依然会有左表的记录,右表字段用null填充.看起来非常好理解,但实际操作的过程中可能会有一些很容易被忽略的点. 一 ...
- windows的lib与dll
mingw编译出来的动态库的导入库可以直接在vc中直接使用 静态库 lib .a 动态库 dll动态库导入库 lib .dll.a 静态链接库a) 静态链接库的类和函数不需要导出,就能够被其他库调用. ...
- 如何将多个TXT合并成一个TXT,文件名称提取
方法1:1.将所有需要合并的TXT整理到一个文件夹中,切记,TXT合并最好每个TXT内容头或尾留一行间距,因为合并是直接合并,不会保留间距. 2.使用Windows命令cmd,切换到文件所在文件夹 3 ...
- 不用PyScript,网页端运行的Python编辑器
原文:https://lwebapp.com/zh/python-online 需求 有小伙伴可能听说过 PyScript,知道了Python可以通过打包成wasm运行在浏览器端了,这样做一些需要Py ...
- 虚拟机中 Linux 提示“设备上没有空间”,扩容磁盘
查看一下磁盘空间使用情况 #df -hl 已使用100% ls /dev/sd* 先查看一下现有sd系统硬盘 关机,存个快照(存不存无所谓),然后在虚拟机设置里添加扩展磁盘容量,选择SCSI类型 重 ...