Seata 笔记

Seata 笔记

分布式事务理论基础

CAP 定理

  • Consistency 一致性:用户访问分布式系统中的任意节点得到的结果都是一致的
  • Availability 可用性:用户和访问任意健康节点都必须得到响应而不是超时拒绝
  • Partition tolernance 分区容错性:出现独立分区时整个系统依然要对外提供服务
    • Partition 分区:因为网路故障或其他愿意导致分布式系统中的部分节点于其他节点失去连接,形成独立分区,独立分区内部节点可以同步数据而分区之间不能同步

分布式系统不可能同时满足这三个指标,最多满足两个

BASE 理论

BASE 理论时戳CAP的一种解决思路,其包括三个思想:

  • Basically Available 基本可用:分布式系统出现故障时,允许损失部分可用性,即保证核心可用
  • Soft State 软状态:允许系统在一定时间内出现中间状态,即临时的不一致性
  • Eventually Consistent 最终一致性:在软状态结束后,系统最终保持数据一致

基于 CAP 定理额 BASE 理论的几种模式:

  • AP 模式:各子事务分别执行和提交,允许出现结果不一致性,然后采用弥补措施恢复数据即可,实现最终一致
  • CP 模式:各个字数五执行后相互等待,同时提交,同时回滚,实现强一致性,但是事务等待过程中处于弱可用状态

Seata 架构

Seata 事务管理中的三个重要角色

  • TC(Transaction Corrdinator) 事务协调者:维护全局和分支事务状态,协调全局事务提交或回滚
  • TM(Transaction Manager) 事务管理器:定义全局事务的范围,开始全局事务,提交或ui滚全局事务
  • RM(Resource Manager) 资源管理器:管理分支事务处理的资源,与 TC 交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚

Seata 架构

Seata 提供的分布式事务解决方案:

  • XA 模式:强一致性分阶段事务模式,牺牲了一定可用性,对业务无侵入
  • AT 模式:最终一致分阶段事务模式,对业务无侵入,Seata 的默认模式
  • TCC 模式:最终一致的分阶段事务模式,对业务代码有侵入
  • SAGA 模式:长事务模式,对业务有侵入

XA 模式

XA 规范是 X/Open 组织定义的分布式事务处理(DTP, Distributed Transaction Processing)标准,描述了全局TM与局部RM之间的接口,几乎所有的主流数据库都对 XA 规范提供了支持,其分为两个阶段

  1. TM 通知 RM 执行各自的业务,RM 准备好后不提交,通知 TM 以就绪,若失败则发送失败通知给 TM
  2. TM 收到所有 RM 的就绪通知后通知各个 RM 提交事务,若第一阶段收到了失败通知则通知所有的 RM 进行回滚

XA模式

XA 模式优点:

  • 实现了分布式事务的强一致性,满足 ACID 原则
  • 常用数据库都支持 XA 模式,实现简单,对业务代码没有侵入

XA 模式缺点:

  • 第一阶段锁定数据库资源,等待第二阶段结束才释放,所以性能较差
  • 依赖数据库本身的事务,若数据库不支持则无法使用

XA 模式使用:

  1. 配置文件,对数据源进行代理,之后微服务的sql语句执行都会被数据源的代理对象拦截下来,RM 内部执行相应操作:
seata:data-source-proxy-mode: XA
  1. 全局事务入口方法处加上@GlobalTransactional注解

AT 模式

AT 模式和 XA 模式同样为分阶段提交的事务模型,其解决了 XA 模式中资源锁定时间过长的问题,其两个阶段为:

  1. TM 通知 RM 执行各自的业务,RM 执行业务并直接提交事务,将事务的更新信息存入 undo log(数据快照) 中,并向 TM 发送成功和失败通知
  2. 若所有 RM 都成功,则删除快照,否则根据快照进行回滚来恢复数据

AT模式

AT 模式与 XA 模式的区别:

  • XA 模式一阶段不提交事务,锁定资源, AT 模式一阶段提交事务,不锁定资源
  • XA 模式依赖数据库事务实现回滚,AT 模式利用数据快照进行回滚
  • XA 模式实现的为强一致性,而 AT 模式为最终一致性

AT 模式的脏写问题

为了解决 AT 模式的脏写问题,Seata 引入了全局锁来实现事务的写隔离,其由 TC 记录当前正在操作某行数据的事务,该事务持有全局锁,具备执行权

在全局锁实现中,TC 会创建一张表,存有事务 id,事务操作的表和表中的某个 id(对应事务操作的该表中的数据行),有点类似 MVCC

AT 模式中,数据快照保存由两份,一份为事务跟新数据前的快照(before-image)和事务提交前的快照(after-image),事务回滚时两份快照不一致时说明存在非 seata 管理的事务对数据进行了操作,说明数据无法恢复

AT 模式优点:

  • 一阶段直接提交数据库事务,释放数据库资源,性能相比 XA 模式更好
  • 利用全局锁实现隔离性
  • 框架自动完成事务的回滚和提交,对业务代码无侵入

AT 模式缺点:

  • 实现的是最终一致性,两阶段之间处于软状态,数据不一致
  • 框架的快照生成和处理会影响数据库性能

AT 模式的使用

  1. 在微服务关联的数据库中创建相应的快照 undo_log 表和全局锁 lock_table 表
  2. 配置文件:
seata:data-source-proxy-mode: AT
  1. 全局事务入口方法处加上@GlobalTransactional注解

TCC 模式

TCC 模式同 AT 模式一样,每个阶段都是独立事务,但是 TCC 模式需要手动编码来实现数据恢复,需要实现三个方法:

  • Try:资源的检测和预留
  • Confirm:完成资源操作业务,Try成功后调用,失败会重试
  • Cancel:预留资源释放,可以视作 Try 的反向操作,失败会重试

TCC 模式

TCC 模式优点:

  • 一阶段直接提交事务,释放数据库资源,性能好
  • 相比 AT 模式,无需生成快照,也无需使用全局锁,性能更好
  • 不依赖数据库事务,可以适用在非事务型数据库

TCC 模式缺点:

  • 需要手动实现 Try,Confirm,Cancel 三个方法,对业务代码由侵入
  • 需要考虑 Confirm 和 Cancel 的失败情况,需要做好幂等处理

TCC 空回滚和业务悬挂

当某分支事务的 try 阶段阻塞时,可能导致全局事务超时而触发二阶段的 cancel 操作。在未执行 try 操作时先执行了 cancel 操作,这是 cancel 不能做回滚,即空回滚

对于已经空回滚的业务,如果以后执行 try,就永远不可能 confirm 或 cancel,即业务悬挂,应当组织执行空回滚后的 try 操作,避免悬挂

解决:在数据库的表中添加一个额外的字段来记录事务状态,是出于 try,confirm 和 cancel 中的那个阶段

  • 判断空回滚:在 cancel 中,查询 try 的操作是否成功,如果查询不到数据则进行空回滚
  • 避免业务悬挂:在 try 中,查询 cancel 是否释放了资源,若查询到 cancel 已经执行,则拒绝执行 try 业务

TCC 模式的使用

编写 TCC 接口并编写实现类

@LocalTCC 
public interface TCCService {/*** try 方法* @TwoPhaseBusinessAction 注解中的name属性与方法名一致,commitMethod 属性 rollbaclMethod 属性用于指定 confirm 和 cancel 方法* @BusinessACtionContextParameter 注解标记的属性会放在上下文中,confirm 和 cancel 方法都能通过上下文拿到该属性信息**/@TwoPhaseBusinessAction(name = "prepare", commitMethod = "confirm", rollbaclMethod = "cancel")void prepare(@BusinessActionContextParameter(ParamName = "param") String param);/*** confirm 方法**/boolean confirm(BusinessActionContext context);/*** confirm 方法**/boolean cancel(BusinessActionContext context);
}

Saga 模式

Saga 模式是 Seata 提供的长事务解决方案,分为两个阶段:

  1. RM 直接提交本地事务
  2. 若所有的本地事务都成功则什么事都不做,若存在事务失败则执行手动编写的补偿业务来回滚

Saga 模式优点:

  • 可以实现基于事件驱动的异步调用,吞吐量高
  • 一阶段直接提交事务,释放数据库资源,性能好
  • 不用向 TCC 模式一样编写三个阶段的业务代码,实现相对简单

Saga 模式的缺点

  • 软状态持续事件不确定,时效性差
  • 没有事务隔离机制,存在脏写现象

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

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

相关文章

单片机第三季-第一课:STM32基础

官方网址:STMCU中文官网 STM32系列分类: 型号命名原则: STM32F103系列: 涉及到的几个概念: DMA:Direct Memory Access,直接存储器访问。DMA传输将数据从一个地址空间复制到另一个地址空间&…

Credo推出业界首款单片集成CMOS VCSEL驱动器的800G光DSP芯片

针对AOC及短距(SR)光模块优化的新型Credo DSP,适用于下一代超大规模数据中心/AI应用 加州圣何塞和中国深圳,2023年9月6日——Credo Technology(纳斯达克股票代码:CRDO)今日发布两款新品&#x…

远程管理通道安全SSH协议主机验证过程

可以使用SSH协议进行远程管理通道安全保护,其中涉及的主要安全功能包括主机验证、数据加密性和数据完整性保护。 这里要注意的是【主机验证】和【身份验证】的区别,主机验证是客户端确认所访问的服务端是目标访问对象,比如从从客户端A(192.16…

七、Linux中一些符号的含义和宿主目录的介绍

1、Linux中一些符号的含义 在Linux命令行中,会看到如下一些符号,含义如下。 符号含义. 代表当前目录..代表上一层目录,当前目录的父目录-代表前一个目录,刚才从哪个目录cd过来~代表当前用户的宿主目录/代表根目录$普通用户的命…

nginx-带宽限制-令牌桶算法

nginx的令牌桶算法 客户请求nginx时,通过给每个请求授予令牌,来给予每个请求响应的带宽,当令牌全部授予完了,后面的请求就处于等待中。 假如一个令牌给100M带宽,那么两个令牌就是200M。有多少牌子,就有多少…

The Sandbox 将参加 Token2049 活动,连接 Web3 社区力量

Token2049,新加坡首屈一指的加密货币和区块链活动即将到来,将汇聚成千上万的 NFT 项目、建设者、社区成员、企业家、投资者和爱好者,共同探讨 Web3 的最新进展和合作机会。 The Sandbox 将参加 Token2049 的多个活动,与我们的合作…

自定义映射resultMap

1、resultMap处理字段和属性的映射关系 正常来说属性名和字段名不一致就不能正确赋值。 简单做法就是都改为一致,但是属性名有驼峰命名规则,字段有下划线_的命名规则。 若字段名和实体类中的属性名不一致,此时也可通过以下两种方式处理字段名…

iPhone 14四款机型电池容量详细参数揭秘

苹果推出的iPhone 14系列与2021系列的设计和外形尺寸相同(仅缩小了几分之一毫米),所以这并不奇怪,但电池容量也大致相同。 虽然可能不足以对电池寿命产生可衡量的影响,但也存在微小的差异。不同的是,现在有…

探索Kubernetes的高可用性:单master集群和多master节点集群方案

一、单Master集群 k8s 集群是由一组运行 k8s 的节点组成的,节点可以是物理机、虚拟机或者云服务器。k8s 集群中的节点分为两种角色:master 和 node。 master 节点:master 节点负责控制和管理整个集群,它运行着一些关键的组件&…

【excel密码】excel文件加密方法总结:

想要给Excel文件进行加密,方法有很多,今天分享三种Excel加密方法给大家。 打开密码 设置了打开密码的excel文件,打开文件就会提示输入密码才能打开excel文件,只有输入了正确的密码才能打开并且编辑文件,如果密码错误…

SpringCloud(34):Nacos服务发现

1 从单体架构到微服务 1.1单体架构 Web应用程序发展的早期,大部分web工程师将所有的功能模块打包到一起并放在一个web容器中运行,所有功能模块使用同一个数据库,同时,它还提供API或者UI访问的web模块等。 尽管也是模块化逻辑,但是最终它还是会打包并部署为单体式应用,这…

SM5202 是一款完整的采用恒定电流/恒定电压的单节锂电池线性充电器

简介: SM5202 是一款完整的采用恒定电流/恒定电压的单节锂电池线性充电器,并带有锂电池正负极反接保护功能,可以保护芯片和用户安全。由于采用了内部 PMOSFET 架构,加上防倒充电路,所以不需要外部检测电阻和隔离二极管…