当前位置: 首页 > 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…...

【Vue2.0源码学习】虚拟DOM篇-Vue中的DOM-更新子节点

文章目录 1. 前言2. 更新子节点3. 创建子节点4. 删除子节点5. 更新子节点6. 移动子节点7. 回到源码8. 总结 1. 前言 在上一篇文章中,我们了解了Vue中的patch过程,即DOM-Diff算法。并且知道了在patch过程中基本会干三件事,分别是:…...

rsync

配置rsync源服务器: #建立/etc/rsyncd.conf 配置文件 vim /etc/rsyncd.conf #添加以下配置项 uid root gid root use chroot yes #禁锢在源目录 address 192.168.80.10 …...

javascript:void(0)

javascript:void(0) 是一个 JavaScript 中常见的使用方式&#xff0c;它通常用于在 HTML 中作为链接的 href 属性值。 在 HTML 中&#xff0c;链接&#xff08;<a> 元素&#xff09;的 href 属性指定了链接目标的 URL。当用户点击该链接时&#xff0c;浏览器会加载该 UR…...

ThingsBoard教程(五三):规则节点解析 Kafka Node, MQTT Node

Kafka Node Since TB Version 2.0 Kafka节点将消息发送到Kafka代理。它可以接收任何类型的消息。该节点会通过Kafka生产者将记录发送到Kafka服务器。 配置 主题模式 - 可以是静态字符串,也可以是使用消息元数据属性解析的模式。例如${deviceType}引导服务器 - 用逗号分隔的…...

基于PHP实现的网上留言管理系统的设计

摘 要 随着互联网技术的迅猛发展,网络已经充斥到我们生活的方方面面,网上留言系统已经成为各种网站不可或缺的一个组成部分。一个设计美观、功能完善的网上留言系统是网站吸引网民的一个重要因素。同时,它还为网络用户提供了一个多人参与的信息交流平台。基于PHP实现的网上…...

【9 Vue全家桶 – Vuex状态管理】

1 什么是状态管理 其实是数据管理但是为了更好的指出是由于状态的变化导致数据的变化(响应式数据),我们称之为状态管理. 2 Vuex的状态管理 组件只能直接读取state,而不能直接修改state,必须通过mutation才能修改.(pinia可以直接读取和修改state) 3 Vuex的安装 npm install …...

Oracle游标学习

declare-- 1 声明一个游标cursor emp_cursor isselect ID,XM,KSNO from ZGXX where rownum < 10; v_stu_info emp_cursor%rowtype; -- %rowtype: 声明 emp表的所有字段 begin-- 2 开启游标open emp_cursor;-- 3 获取数据&#xff08;一次获取一行&#xff09;循环获取 去掉…...

几种常用的正则表达式

1、身份证号正则表达式 身份证号是一串18位数字和字母的组合&#xff0c;其中最后一位可能为数字或者字母 X。以下是可以用于匹配身份证号的正则表达式&#xff1a; /^[1-9]\d{5}(19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[Xx\d]$/上述正则表达式中包含…...

华为OD机试真题 Java 实现【快速开租建站】【2023Q1 200分】,附详细解题思路

一、题目描述 当前IT部门支撑了子公司颗粒化业务&#xff0c;该部门需要实现为子公司快速开租建站的能力&#xff0c;建站是指在一个全新的环境部署一套IT服务。 每个站点开站会由一系列部署任务项构成&#xff0c;每个任务项部署完成时间都是固定和相等的&#xff0c;设为1。…...

照片中对象识别模型YOLOv3在iOS项目中的浅析与使用

本文所指的YOLOv3模型为苹果开发者官网提供的图形识别对象的CoreML模型&#xff0c;可识别80种对象&#xff0c;并给出识别的对象在图形中的位置和大小信息。 我们可以直接在官网下载该模型&#xff1a; 机器学习 - 模型 - Apple Developer 然后直接将模型拖入工程中&#x…...