中间件之Seata

一、引言

在微服务架构日益盛行的今天,分布式事务成为了一个必须面对和解决的问题。传统的本地事务已经无法满足分布式环境下的数据一致性需求,因此分布式事务解决方案应运而生。Seata作为一款开源的分布式事务中间件,以其高性能、易用性和灵活性受到了广泛的关注和应用。本文将对Seata进行全面深入的解析,包括其基本概念、事务模式、工作原理、代码示例以及实际应用场景,旨在帮助开发者更好地理解和使用Seata。

二、Seata概述

2.1 基本概念

Seata(Simple Extensible Autonomous Transaction Architecture)是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。Seata通过提供全局事务管理和协调服务,支持多种主流的数据库和RPC框架,以及Spring Cloud和Dubbo等微服务框架。Seata的设计目标是解决分布式事务的一致性问题,实现高可用、高性能、易扩展的分布式事务管理。

2.2 角色与组件

Seata主要由三个核心角色组成:

TC (Transaction Coordinator)

事务协调器,维护全局和分支事务的状态,驱动全局事务提交或回滚。TC是单独部署的Server服务端。

TM (Transaction Manager)

事务管理器,控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。TM和RM都是嵌入到应用中的Client客户端。

RM (Resource Manager)

资源管理器,管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

三、Seata的事务模式

Seata支持四种分布式事务模式:AT模式、TCC模式、Saga模式和XA模式,每种模式都有其独特的适用场景和优缺点。

3.1 AT模式

3.1.1 概念与原理

AT模式(Automatic Transaction)是Seata创新的一种非侵入式的分布式事务解决方案。在AT模式下,用户只需关心自己的“业务SQL”,Seata框架会自动生成事务的二阶段提交和回滚。

AT模式的工作原理如下:

一阶段

Seata会拦截“业务SQL”,首先解析SQL语义,找到“业务SQL”要更新的业务数据,在业务数据被更新前,将其保存成“before image”,然后执行“业务SQL”更新业务数据,在业务数据更新之后,再将其保存成“after image”,最后生成行锁。以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性。

二阶段提交

如果全局事务提交,Seata不会执行任何操作,因为一阶段已经完成数据的持久化。

二阶段回滚

如果全局事务回滚,Seata会根据“before image”和“after image”生成反向的SQL语句,并执行这些反向SQL语句来撤销一阶段的业务数据变更。

3.1.2 优缺点

优点
简化编程模型

对业务代码无侵入性,可以在不修改业务逻辑的情况下实现分布式事务。

高性能

通过异步通信和批量处理等手段,提高了分布式事务的性能。

缺点
数据一致性风险

在极端情况下(如数据库宕机),可能会出现数据一致性风险。

不支持跨数据库事务

AT模式主要适用于单个数据库的事务管理,对于跨数据库的事务支持有限。

3.1.3 代码示例

以下是一个使用Seata AT模式实现分布式事务的简单示例,假设有两个微服务:订单服务和库存服务,订单服务负责创建订单,库存服务负责扣减库存。当用户下单时,需要同时调用两个服务,并保证数据一致性。

// 订单服务代码示例
@GlobalTransactional
public void createOrder(Order order) {// 调用库存服务扣减库存inventoryService.decreaseStock(order.getCommodityCode(), order.getCount());// 创建订单orderMapper.insert(order);
}// 库存服务代码示例
@GlobalTransactional
public void decreaseStock(String commodityCode, int count) {// 扣减库存storageMapper.updateStock(commodityCode, count);
}

在上述代码中,通过在createOrderdecreaseStock方法上添加@GlobalTransactional注解,Seata会自动管理这两个方法之间的事务一致性。

3.2 TCC模式

3.2.1 概念与原理

TCC模式(Try-Confirm-Cancel)是Seata支持的一种由业务方细粒度控制的侵入式分布式事务解决方案。TCC模式将分布式事务拆分为Try、Confirm和Cancel三个阶段,每个阶段都需要业务方自行实现。

Try阶段

执行业务的预备操作,完成资源的检查和预留。如果预备操作成功,则返回try成功状态;如果预备操作失败,则返回try失败状态。

Confirm阶段

在Try阶段成功执行后,执行业务的确认操作,完成资源的最终提交。Confirm阶段必须保证幂等性,即无论执行多少次,结果都是一样的。

Cancel阶段

在Try阶段成功执行后,如果全局事务需要回滚,则执行业务的取消操作,释放Try阶段预留的资源。Cancel阶段也必须保证幂等性。

3.2.2 优缺点

优点
灵活性高

TCC模式允许业务方细粒度地控制事务的每个阶段,可以适应复杂的业务场景。

性能优越

TCC模式在第一阶段只锁定必要的资源,减少了资源锁持有时间,提高了并发性能。

缺点
业务侵入性强

TCC模式需要业务方实现Try、Confirm和Cancel三个阶段的操作,增加了业务代码的复杂度。

实现难度大

需要保证Try、Confirm和Cancel三个阶段的幂等性,以及处理各种异常情况,实现难度较大。

3.2.3 代码示例

以下是一个使用Seata TCC模式实现分布式事务的示例:

// TCC接口定义
public interface TccActionOne {@TwoPhaseBusinessAction(name = "DubboTccActionOne", commitMethod = "commit", rollbackMethod = "rollback")public boolean prepare(BusinessActionContext actionContext, @BusinessActionContextParameter(paramName = "a") String a);public boolean commit(BusinessActionContext actionContext);public boolean rollback(BusinessActionContext actionContext);
}// TCC接口实现
@Service
public class TccActionOneImpl implements TccActionOne {@Overridepublic boolean prepare(BusinessActionContext actionContext, String a) {// 执行业务的预备操作// ...return true; // 返回try成功状态}@Overridepublic boolean commit(BusinessActionContext actionContext) {// 执行业务的确认操作// ...return true; // 返回commit成功状态}@Overridepublic boolean rollback(BusinessActionContext actionContext) {// 执行业务的取消操作// ...return true; // 返回rollback成功状态}
}

在上述代码中,TccActionOne接口定义了Try、Confirm和Cancel三个阶段的操作,TccActionOneImpl类实现了这些操作。业务方需要在每个阶段中编写相应的业务逻辑,并保证这些逻辑的幂等性。

3.3 Saga模式

3.3.1 概念与原理

Saga模式是一种长事务模式,它将一个长事务拆分成多个小事务,每个小事务都是一个短事务。Saga模式的核心思想是补偿,即如果某个小事务失败了,可以通过回滚之前的小事务来保证整个长事务的正确性。

Saga模式的工作原理如下:

  • 正向执行:依次执行每个小事务,如果所有小事务都执行成功,则长事务成功。
  • 逆向补偿:如果某个小事务执行失败,则依次执行之前所有成功小事务的补偿操作,直到所有小事务都回滚到初始状态。

3.3.2 优缺点

优点
适用于长事务

Saga模式特别适用于需要跨多个服务或数据库完成的长事务。

业务侵入性较低

Saga模式只需要业务方实现正向和反向两个操作,相对于TCC模式来说侵入性较低。

缺点
补偿操作的复杂性

在复杂业务场景下,补偿操作可能很难实现,且容易出现补偿失败的情况。

数据一致性风险

在极端情况下(如网络分区),可能会出现数据一致性风险。

3.3.3 代码示例

以下是一个使用Seata Saga模式实现分布式事务的示例:

// 伪代码示例  // 定义一个服务接口,包含正向服务和补偿服务  
interface SagaService {  void execute(); // 正向服务  void compensate(); // 补偿服务  
}  // 实现Saga服务  
class OrderService implements SagaService {  @Override  public void execute() {  // 执行订单创建的正向逻辑  }  @Override  public void compensate() {  // 执行订单创建的补偿逻辑  }  
}  class PaymentService implements SagaService {  @Override  public void execute() {  // 执行支付的正向逻辑  }  @Override  public void compensate() {  // 执行支付的补偿逻辑  }  
}  // Saga协调器  
class SagaCoordinator {  public void executeSaga(List<SagaService> services) {  for (SagaService service : services) {  try {  service.execute(); // 执行正向服务  } catch (Exception e) {  // 出现异常时,回滚已执行的服务  for (int i = services.indexOf(service) - 1; i >= 0; i--) {  services.get(i).compensate();  }  throw e; // 抛出异常,中断流程  }  }  // 所有服务执行成功,提交事务  }  
}  // 使用示例  
public class SagaExample {  public static void main(String[] args) {  List<SagaService> services = Arrays.asList(new OrderService(), new PaymentService());  SagaCoordinator coordinator = new SagaCoordinator();  try {  coordinator.executeSaga(services);  } catch (Exception e) {  System.err.println("Saga execution failed: " + e.getMessage());  }  }  
}

3.4 XA模式

3.4.1 概念与原理

执行阶段:

RM(资源管理器)将分支事务注册到全局事务协调器(TC)。
RM执行分支业务操作,但不提交。这确保了分支事务不会立即生效,等待全局协调后再决定是否提交。
RM报告分支事务执行状态给TC。

完成阶段:

TC检测各个分支事务的执行状态。
如果所有分支事务都成功,TC通知所有RM提交事务,即提交所有分支事务的更改。
如果有任何分支事务失败,TC通知所有RM回滚事务,即回滚所有分支事务的更改。
RM接收来自TC的指令,根据指令来提交或回滚分支事务。

3.4.2 优缺点

优点
  1. 保证了数据的强一致性,满足ACID原则。
  2. 几乎所有主流的数据库都支持XA协议,实现简单。
  3. 没有代码侵入,开发者无需修改业务代码。
缺点
  1. 性能较差,因为一阶段需要锁定数据库资源,等待二阶段结束才释放。
  2. 依赖关系型数据库实现事务,不适用于非关系型数据库。
  3. 存在单点问题,全局事务协调器可能成为系统瓶颈。

3.4.3 代码示例

XA模式的代码实现涉及Seata的配置和事务注解的使用。以下是一个简化的代码示例,展示了如何在Spring Boot项目中使用Seata的XA模式:

// 引入Seata依赖(在pom.xml中)  
<dependency>  <groupId>io.seata</groupId>  <artifactId>seata-spring-boot-starter</artifactId>  <version>你的Seata版本</version>  
</dependency>  // 配置文件(application.yml)  
seata:  enabled: true  data-source-proxy-mode: XA  # 其他Seata配置...  // 服务实现类  
@Service  
public class OrderService {  @Autowired  private OrderMapper orderMapper;  @GlobalTransactional  public void createOrder(Order order) {  // 执行订单创建逻辑  orderMapper.insert(order);  // 调用其他服务或执行其他业务逻辑...  }  
}  // Mapper接口  
@Mapper  
public interface OrderMapper {  void insert(Order order);  // 其他数据库操作方法...  
}  // 实体类  
public class Order {  private Long id;  private String userId;  private BigDecimal amount;  // 其他字段和getter/setter方法...  
}

在上面的代码中,@GlobalTransactional注解标记了全局事务的边界。当createOrder方法被调用时,Seata会启动一个全局事务,并协调所有参与的分支事务以保证数据的一致性。注意,这里假设数据库已经支持XA协议,并且已经正确配置了Seata Server和相关依赖。

四、总结

Seata作为开源的分布式事务中间件,在微服务架构下提供了高性能和简单易用的分布式事务服务。它支持AT、TCC、Saga和XA四种事务模式,每种模式各有优缺点和适用场景。AT模式通过自动生成事务的二阶段提交和回滚,简化了编程模型,但存在数据一致性风险和跨数据库事务支持有限的问题。TCC模式允许业务方细粒度控制事务的每个阶段,灵活性高且性能优越,但业务侵入性强且实现难度大。Saga模式适用于长事务,通过补偿操作保证事务正确性,但补偿操作复杂且存在数据一致性风险。XA模式则利用数据库对XA协议的支持,保证数据强一致性,但性能较差且存在单点问题。开发者在选择使用Seata时,应根据具体业务场景和需求,选择合适的事务模式,并合理配置和使用Seata以保证分布式事务的一致性和性能。

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

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

相关文章

优化多表联表查询的常见方法归纳

目录 一、使用mybatis的嵌套查询 二、添加表冗余字段&#xff0c;减少联表查询需求 三、分表预处理&#xff0c;前端再匹配 一、使用mybatis的嵌套查询 【场景说明】 前端需要展示一张列表&#xff0c;其中的字段来源于多张表&#xff0c;如何进行查询优化&#xff1f; 【…

飞凌嵌入式FET527N-C核心板已适配OpenHarmony4.1

近期&#xff0c;飞凌嵌入式为FET527N-C核心板适配了OpenHarmony4.1系统——进一步提升了核心板的兼容性、稳定性和安全性。 OpenHarmony4.1在应用开发方面展现了全新的开放能力&#xff0c;以更加清晰的逻辑和场景化视角提供给开发者丰富的API接口&#xff0c;应用开发能力得…

让你的 IDEA 使用更流畅 | IDEA内存修改

随着idea使用越来越频繁&#xff0c;笔者最近发现使用过程中有时候会出现卡顿现象&#xff0c;例如&#xff0c;启动软件变慢&#xff0c;打开项目的速度变慢等&#xff1a; 因此如果各位朋友觉得最近也遇到了同样的困惑&#xff0c;不妨跟着笔者一起来设置IDEA的内存大小吧~ …

基于ECS和NAS搭建个人网盘

前言 在数字化时代&#xff0c;数据已成为我们生活中不可或缺的一部分。个人文件、照片、视频等数据的积累&#xff0c;使得我们需要一个安全、可靠且便捷的存储解决方案。传统的物理存储设备&#xff08;如硬盘、U盘&#xff09;虽然方便&#xff0c;但存在易丢失、损坏和数据…

登录前端笔记(二):vuex管理用户数据;跨域;axios封装;环境;请求响应拦截;权限;用户资料Vuex共享

一、Vuex登录流程之用户模块&#xff1a; 简言之&#xff1a;点击登录调用actions且得到token&#xff0c;把得到的token提交给mutations从而修改state里的数据。 原视频 &#xff08;1&#xff09;Vuex用户模块流程 组件页面里点击登录后&#xff0c;调用stores里的actions&…

Springboot实现自动装配

自动装配&#xff08;Auto-wiring&#xff09;是 Spring 框架中的一个重要特性&#xff0c;它是指 Spring 容器在创建和管理 Bean 时&#xff0c;能够自动识别并满足 Bean 之间的依赖关系&#xff0c;无需开发人员显式地在配置文件或代码中指定依赖注入的具体细节。以下是对自动…

09_实现reactive之代理 Set 和 Map

目录 创建代理建立响应式联系避免污染原始数据处理 forEachfor...ofvalues 与 keys 方法 Set 和 Map 都有特定的属性和方法来操作自身&#xff0c;因此需要单独处理。 创建代理 我们来看一段案例代码&#xff0c;体验一下和它们的独特之处&#xff0c;如下&#xff1a; const…

《使用Gin框架构建分布式应用》阅读笔记:p108-p126

《用Gin框架构建分布式应用》学习第8天&#xff0c;p108-p126总结&#xff0c;总计18页。 一、技术总结 1.Redis eviction policy (1)什么是 eviction policy? The eviction policy determines what happens when a database reaches its memory limit. (2)配置示例 在r…

将 Ubuntu 系统中的 **swap** 空间从 2GB 扩展到 16GB

要将 Ubuntu 系统中的 swap 空间从 2GB 扩展到 16GB&#xff0c;可以按照以下步骤操作&#xff1a; 1. 关闭现有 Swap 文件 首先需要禁用当前的 swap 文件&#xff0c;以便重新调整其大小。 sudo swapoff -a2. 删除旧的 Swap 文件 假设当前的 swap 文件位于 /swapfile&…

基于Multisim电子配料秤电路设计(含仿真和报告)

【全套资料.zip】电子配料秤电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 电子配料秤仿真功能: 准确测量物体重量&#xff0c;精确度0.1Kg使用两位数码管显示重量信息 使用拨码…

如何将两个同样大小的List组装成一个Map?

如果你有两个同样大小的列表&#xff0c;并且想要将它们组装成一个Map&#xff0c;其中第一个列表的元素作为key&#xff0c;第二个列表的元素作为value&#xff0c;你可以使用Java 8的流&#xff08;Stream&#xff09;API来实现这一操作。 // 假设这是你的两个同样大小的列表…

【C++刷题】力扣-#108-将有序数组转换为二叉搜索树

题目描述 给定一个升序排列的整数数组 nums&#xff0c;将其转换为一棵高度平衡的二叉搜索树&#xff08;BST&#xff09;。高度平衡的二叉搜索树定义为&#xff1a;一个二叉搜索树&#xff0c;其中左右两个子树的高度差不超过 1。 示例 示例 1 输入: nums [-10,-3,0,5,9] 输…

mysql的卸载与安装

一、mysql的卸载 1、用管理员模式的打开cmd&#xff0c;我的服务名是mysql。 net stop mysql sc delete 服务名 2、将下图中有包含‘bin’目录&#xff0c;‘data’目录等等的这个总目录删掉 如图我的目录是&#xff1a;mysql-5.7.28-winx64 3、删除mysql的隐藏文件 C:\Program…

OBOO鸥柏丨《满天星(MTSTAR)》信息发布系统售后服务点位收费标准

户外/室内款系列商用显示屏终端外观贴有OBOO鸥柏品牌铭牌等出厂标识&#xff0c;均为OBOO鸥柏官方出品出厂&#xff0c;均享受永久技术免费服务。认准鸥柏(OBOO)官方出厂等商用液晶显示硬件产品配套。鸥柏(OBOO)满天星(MTSTAR)多媒体信息发布系统是一种集成了多种多媒体元素和技…

在做题中学习(66):两数相加

解法&#xff1a;模拟 思路&#xff1a;定义一个变量t&#xff0c;存储相加后的结果&#xff0c;个位赋给新节点&#xff0c;十位&#xff08;表示有进位&#xff09;留下&#xff0c;累加到下一次加法&#xff08;相当于上进位&#xff09;。while里即便cur1和cur2都为空了&a…

3dsMax 展管道UV

3dsMax 展管道UV 创建管道模型 https://blog.csdn.net/GoodCooking/article/details/140876371有管道模型之后&#xff0c;进行展UV 展开UV之后 旋转UV&#xff0c;大致靠左 挨个拉直拐角 挨个拉直拐角 缩放到UV里面&#xff0c;不要拖拽点。 水平缩放&#xff0c;将U…

Aurora 4.6.2 | 第三方谷歌商店,无需谷歌框架

Aurora Store是谷歌Play Store的一个非官方FOSS客户端&#xff0c;通常称为‘极光商店’&#xff0c;设计优雅。Aurora Store不仅可以下载、更新和搜索Play Store等应用程序&#xff0c;还为用户提供了新功能。应用提供范围广泛的游戏和应用程序&#xff0c;包括音乐流媒体、购…

互联网人口红利趋缓下的社群粉丝经济新模式探索

摘要&#xff1a;随着互联网人口红利消失近十年&#xff0c;国内互联网人口红利爆发时期凭借大量用户取得成功的模式不再适用。如今互联网人口增长进入平缓期&#xff0c;社群粉丝经济成为新方向。其能借助人群画像精准推送营销信息&#xff0c;降低成本。如“21 链动模式 AI 智…

拦截器或过滤器往本次请求体中添加信息

步骤一&#xff1a;定义新的Request package com.ict.lux.framework.interceptor;import java.util.Collections; import java.util.Enumeration; import java.util.Map; import java.util.TreeMap;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.…

图像识别开发前沿:精准识别与高效算法的融合

图像识别开发前沿正经历着精准识别与高效算法的深度融合&#xff0c;这一趋势推动了技术的快速发展&#xff0c;并拓宽了其应用领域。以下是对图像识别开发前沿的详细探讨&#xff1a; 一、精准识别的技术突破 深度学习技术的崛起&#xff1a; 深度学习&#xff0c;特别是卷积…