当前位置: 首页 > news >正文

SSM 如何使用 Seata 框架实现分布式事务?

SSM 如何使用 Seata 框架实现分布式事务?

分布式事务是现代分布式系统中必不可少的一部分,而 Seata 框架是一种常用的分布式事务处理方式。在 SSM 框架中,我们可以使用 Seata 框架来管理分布式事务。本文将介绍如何在 SSM 框架中使用 Seata 框架实现分布式事务,并提供相应的代码示例。

在这里插入图片描述

什么是 Seata 框架?

Seata 框架是一种分布式事务解决方案,它可以帮助我们解决分布式事务的一致性问题。Seata 框架基于 TCC(Try-Confirm-Cancel)事务模型,将分布式事务拆分成以下三个阶段:

  • Try 阶段:在该阶段中,系统会尝试执行分布式事务。如果所有参与者都执行成功,则分布式事务进入 Confirm 阶段。否则,分布式事务进入 Cancel 阶段。
  • Confirm阶段:在该阶段中,系统会向所有的参与者发出 confirm 请求,通知它们提交分布式事务。如果所有参与者都提交成功,则分布式事务提交。否则,分布式事务回滚。
  • Cancel 阶段:在该阶段中,系统会向所有的参与者发出 cancel 请求,通知它们回滚分布式事务。如果所有参与者都回滚成功,则分布式事务回滚。否则,需要手动处理分布式事务的异常情况。

Seata 框架通过将分布式事务拆分成三个阶段,可以保证分布式事务的一致性,并且具有较高的性能和可靠性。

SSM 如何使用 Seata 框架实现分布式事务?

在 SSM 框架中使用 Seata 框架实现分布式事务主要涉及以下三个方面:

  1. 数据库的事务管理

在 SSM 框架中,我们可以使用 Spring 的声明式事务管理来管理数据库的事务。通过在 Service 层中添加 @Transactional注解,我们可以将一组数据库操作绑定到一个事务中。在使用 Seata 框架时,我们需要将事务管理器设置为 SeataTransactionManager,并通过 dataSource 属性指定数据源。

以下是一个使用 Seata 框架的数据库事务管理的示例代码:

@Configuration
public class AppConfig {@Beanpublic DataSource dataSource() {// 创建数据源return new DruidDataSource();}@Beanpublic PlatformTransactionManager transactionManager() {// 创建事务管理器return new SeataTransactionManager();}
}@Service
@Transactional
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Override@GlobalTransactionalpublic void transferMoney(int fromUserId, int toUserId, double money) {// 扣除转出用户的余额userMapper.updateUserBalance(fromUserId, -money);// 增加转入用户的余额userMapper.updateUserBalance(toUserId, money);}
}

在上面的示例代码中,我们通过 @Transactional 注解将 transferMoney() 方法绑定到一个事务中,并使用 SeataTransactionManager 作为事务管理器。此外,我们还使用了 @GlobalTransactional 注解来标记分布式事务的入口。

  1. Seata 服务端的配置

在使用 Seata 框架时,我们需要在项目中引入 Seata 相关的依赖,并在 Seata 服务端进行相应的配置。Seata 服务端主要包括以下两个组件:

  • Seata Server:用于管理 Seata 分布式事务的注册、发现和协调。
  • Seata RM(Resource Manager):用于管理分布式事务中涉及的资源(如数据库、消息队列等)。

以下是一个使用 Seata 框架的 Seata 服务端配置的示例代码:

seata:enabled: trueapplication-id: ${spring.application.name}tx-service-group: my_test_tx_groupconfig:type: nacosnacos:server-addr: localhost:8848namespace: seataregistry:type: nacosnacos:server-addr: localhost:8848namespace: seatastorage:type: dbdb:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/seata?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: 123456table: global_tablemin-conn: 5max-conn: 30global-table:create-table-if-not-exists: true

在上面的示例代码中,我们在 application.yml 文件中配置了 Seata 相关的参数。其中,seata.enabled 属性用于开启 Seata 功能,seata.application-id 属性用于指定应用 ID,seata.tx-service-group 属性用于指定事务组。seata.config 属性和 seata.registry 属性分别用于指定 Seata 的配置中心和注册中心。在本示例中,我们使用了 Nacos 作为配置中心和注册中心。seata.storage 属性用于指定 Seata 的存储方式,我们在本示例中使用了 MySQL 数据库作为存储方式。

  1. 分布式事务的编程实现

在 SSM 框架中,我们可以使用 Seata 提供的 @GlobalTransactional 注解来标记分布式事务的入口。当我们在 Service 层中的某个方法标记了该注解后,Seata 就会自动协调该方法中的所有数据库操作,并根据 TCC 事务模型来执行分布式事务。

以下是一个使用 Seata 框架实现分布式事务的示例代码:

@Service
public class OrderServiceImpl implements OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate AccountMapper accountMapper;@Autowiredprivate StorageMapper storageMapper;@GlobalTransactional@Overridepublic void createOrder(Order order) {// 扣减库存storageMapper.updateStorage(order.getProductId(), -order.getCount());// 扣减账户余额accountMapper.updateAccount(order.getUserId(), -order.getMoney());// 创建订单orderMapper.createOrder(order);}
}

在上面的示例代码中,我们使用了 @GlobalTransactional 注解来标记 createOrder() 方法,该方法中包含了三个数据库操作:扣减库存、扣减账户余额和创建订单。在该方法中,我们通过调用 updateStorage() 方法、updateAccount() 方法和 createOrder() 方法来执行数据库操作。由于该方法被标记为全局事务,当其中任何一个操作失败时,Seata 就会自动回滚所有操作,确保分布式事务的一致性。

总结

本文介绍了在 SSM 框架中使用 Seata 框架实现分布式事务的方法。通过使用 Seata 框架,我们可以有效地解决分布式事务的一致性问题,提高系统的性能和可靠性。在实现分布式事务时,我们需要注意事务管理、Seata 服务端的配置和分布式事务的编程实现等方面。希望本文能够为大家在 SSM 框架中使用 Seata 框架实现分布式事务提供帮助。

参考资料

  • Seata 官方文档
  • Spring 官方文档

相关文章:

SSM 如何使用 Seata 框架实现分布式事务?

SSM 如何使用 Seata 框架实现分布式事务? 分布式事务是现代分布式系统中必不可少的一部分,而 Seata 框架是一种常用的分布式事务处理方式。在 SSM 框架中,我们可以使用 Seata 框架来管理分布式事务。本文将介绍如何在 SSM 框架中使用 Seata …...

FreeRTOS任务相关API函数

任务创建和删除API函数 xTaskCreate() 创建任务。RAM BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, //任务函数const char* const pcName, //任务名字const uint16_t usStackDepth,//任务堆栈大小void * const …...

VBA之正则表达式(42)-- 提取代码中变量名称

实例需求:待处理代码段如下所示,现在需要提取其中的变量名称。 Public pFactor As Integer Sub TestCode() Dim reg As New RegExp, a As Workbook Dim ms As VBScript_RegExp_55.MatchCollection Dim m As VBScript_RegExp_55.Match Dim i, j Dim x1, y…...

Unity Lightmapping Setting

如下图: Lightmapper: 使用什么硬件或算法渲染 Progressive CPU、Progressive GPU、Enlighten(新的算放目前用的比较少) 此数值会被用于分别乘以Direct Samples,Indirect Samples和Environment Samples这三个数值。这三个数值会被应用于…...

Android 12.0Camera2 静音时拍照去掉快门声音

1.概述 在12.0定制化开发时,在Camera2静音情况下有快门拍照声音,这就不符合使用规范了 静音的情况下拍照也不应该发出声音,所以在静音拍照流程中要求去掉快门声音 2.Camera2静音拍照去掉快门声音核心代码 Camera2拍照主要代码:/packages/apps/Camera2/src/com/android/cam…...

Win11硬盘分区

电脑重装了Win11系统,按WinE打开主文件夹,再点击此电脑,发现: 磁盘只有一个C盘。硬盘的所有空间都在该盘上了,那么我们怎么将其分区呢? Win11硬盘分区步骤: 步骤1: 按WinR输入dis…...

访客管理系统:Lobby Track Crack

Lobbytrack桌面 for 微软视窗 一个强大的、功能齐全的现场访客管理系统解决方案。在本地管理您的数据,网络工作站一起配置访客管理流程的各个方面。 扩展您的系统将本地 Web 模块 添加到您的 Lobbytrack 桌面系统,并允许您的员工使用本地 Intranet 上的 …...

Lidar AI Solution环境配置

目录 Lidar AI Solution环境配置前言1. Lidar AI Solution1.1 Pipeline overview1.2 GetStart 2. CUDA-BEVFusion2.1 3D目标检测(nuScenes验证集)2.2 演示2.3 模型和数据2.4 前置条件2.5 快速开始推理2.5.1 下载模型和数据到CUDA-BEVFusion文件夹2.5.2 配置environment.sh2.5.3…...

子串--子字符串 0528

210102 201012 A1A2…An An…A2A1 如何做, 翻转的是21,因为2>1; 翻转的是210,因为2>0; 翻转的是2101,因为2>1; 翻转的是21010,因为2>0; 翻转的是210102,因为22且1&…...

大数据教程【01.04】--excel的使用

更多信息请关注WX搜索GZH:XiaoBaiGPT Excel中的大数据处理 Excel是一款功能强大的电子表格软件,它广泛用于数据处理和分析。对于大数据处理,Excel提供了多种功能和工具,可以帮助用户处理大量的数据。在本教程中,我们…...

Java输入输出流

目录 一、数据流概念 1.输入输出的概念​ 2.流的概念 3.流的操作 二、常用的流分类 三、文件输入输出流 1.FileReader和FileWriter 2.FileInputStream和FileOutStream 四、复制文件 一、数据流概念 1.输入输出的概念​ 输入输出技术用于处理设备之间的数据传输&#x…...

1688商品ID采集一件代发详情页面数据

本篇博文介绍了对1688商品详情API的二次封装,将URL参数封装成Python函数,直接传入参数即可获取搜索结果,例如1688商品标题、价格、一件代发、sku属性和URL等。提供了详细的代码示例和接口调用Demo。 1688.item_get-获得1688商品详情数据 1.请…...

丽江“美丽县城”建设,高精度地籍免像控案例分享

一、项目背景 云南省地矿测绘院于2020年6月承接丽江市玉龙县“美丽县城”建设项目1:500倾斜摄影及地形图测绘项目。项目要求对玉龙县城区及其周边等约30平方公里区域进行优于3CM倾斜摄影测量。 并基于三维模型完成地形高程点、地貌、地物特征点的采集成图&#xf…...

我是如何精通软件工程的

软件工程是一个庞大且不断演化的领域,涉及许多创新。虽然如此,大多数技术 —— 如果不是全部 —— 在软件工程中往往最终汇聚为几个基本原则。工程师更好地掌握软件工程的方法是熟悉软件工程的基础知识,而不是那些不断变化的框架、语言或平台…...

如何使用 Python Nornir 实现基于 CLI 的网络自动化?

在现代网络环境中,网络自动化已成为管理和配置网络设备的重要工具。Python Nornir 是一个强大的自动化框架,它提供了一个简单而灵活的方式来执行网络自动化任务。本文将详细介绍如何使用 Python Nornir 实现基于 CLI 的网络自动化。 1. Python Nornir 概…...

并发编程的三大特性之有序性

有序性的概念 Java文件在被cpu执行前会进行编译成cpu可以执行的指令,为了提高cpu的执行效率会对其中的一些语句进行重排序。Java指令最终是乱序执行的目的是为了提高cpu的执行效率,发挥cpu的性能 单例模式由于指令重排可能会出现上述的问题&#xff0…...

LeetCode:相交链表(java)

相交链表 题目描述指针法解题 #LeetCode 160题:相交链表,原题链接 原题链接。相交链表–可以打开测试 题目描述 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返…...

利用PHP导出MySQL数据表结构和SQL文件

目录 一、获取数据库所有的数据表 方法一:TP5 方法二:原生PHP 二、导出指定数据表的数据结构 三、 导出SQL文件 四、生成SQL语句 五、完整代码 前端 后端 语言:PHP 数据库:MySQL 功能:分为四部分,① 查出数…...

接口测试框架分析

框架大体上已经写完了,不过说实话好多代码让我自己写我也写不出来,那该怎么办呢?很简单,把现在已经写好的代码保存起来,等用的时候拿出来复制粘贴就好了,如果你是大神,自己会写,那就…...

spring boot日志

日志介绍日志的使用日志级别日志持久化更简单的输入日志lombok的运行原理 日志介绍 日志的作用: 1:发现问题; 2:定位问题; 3:记录用户的行为:看哪些是方法用户;还能拿到用户的ip&am…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...