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

news2024/12/24 8:33:40

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 {
    @Bean
    public DataSource dataSource() {
        // 创建数据源
        return new DruidDataSource();
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        // 创建事务管理器
        return new SeataTransactionManager();
    }
}

@Service
@Transactional
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    @Override
    @GlobalTransactional
    public 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: true
  application-id: ${spring.application.name}
  tx-service-group: my_test_tx_group
  config:
    type: nacos
    nacos:
      server-addr: localhost:8848
      namespace: seata
  registry:
    type: nacos
    nacos:
      server-addr: localhost:8848
      namespace: seata
  storage:
    type: db
    db:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/seata?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&useSSL=false&allowPublicKeyRetrieval=true
      username: root
      password: 123456
      table: global_table
      min-conn: 5
      max-conn: 30
      global-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 {
    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private AccountMapper accountMapper;

    @Autowired
    private StorageMapper storageMapper;

    @GlobalTransactional
    @Override
    public 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 官方文档

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

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

相关文章

好用工具第2期:手机电脑传文件LocalSend

1. 概要 LocalSend 是一个跨平台的 AirDrop替工具软件。 适用于手机电脑之间的数据文件传输,不需要互联网连接或第三方服务器,是局域网本地通信的快速可靠解决方案。 LocalSend 是一个开源项目, 项目地址是: https://github.com/localsend/localsend …

webpack简单的搭建和使用

随便创建一个空的文件夹,例如说:explore 然后我们测试一下我们的node是否存在 可以正确打印出版本 我们再次输入:npm init -y 创建一个package.json文件 出现这样的情况就成功了 然后我们要安装webpack在终端上输入命令: npm i …

辅助生成: 低延迟文本生成的新方向

大型语言模型如今风靡一时,许多公司投入大量资源来扩展它们规模并解锁新功能。然而,作为注意力持续时间不断缩短的人类,我们并不喜欢大模型缓慢的响应时间。由于延迟对于良好的用户体验至关重要,人们通常使用较小的模型来完成任务…

Kotlin SOLID 原则

Kotlin SOLID 原则 许多 Kotlin 开发者并不完全了解 SOLID 原理,即使他们知道,他们也不知道为什么要使用它。您准备好了解所有细节了吗? 介绍 亲爱的 Kotlin 爱好者,您好!欢迎来到我的新文章。今天我要讲的是 Kotli…

Qt编程基础 | 第六章-窗体 | 6.2、VS导入资源文件

一、VS导入资源文件 1.1、导入资源文件 步骤一: 将所有图片放到各自文件夹下,并将文件夹拷贝到资源文件(.qrc文件)的同级目录下,如下: 步骤二: 新建VS项目的时候,系统会自动建好一…

如何在华为OD机试中获得满分?Java实现【最差产品奖】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

NetApp AFF C 系列——可持续、可扩展且安全可靠的全闪存解决方案

NetApp AFF C 系列 采用全新的闪存技术,同时辅以智能科技加持,将为您带来一个更为经济实惠的全闪存解决方案,它重新定义了安全性、可扩展性和可持续性。 为什么选择 AFF C 系列的新一代全闪存解决方案? 实现现代化,打…

chatgpt+mj+did生成会说话的头像

chatgptmjdid生成会说话的头像 当我们有了 ChatGPT 生成的内容,有了 stable-diffusion、midjourney 或者 dalle2 生成的人像,如果还能让人像动起来,替我们朗诵或者播报一下 ChatGPT 的内容,不就是一个数字人了么? D-…

2023年 微信生态催生就业收入机会超5000万个

文章目录 微信生态催生就业收入机会超5000万个原因相关情况总结 结语 微信生态催生就业收入机会超5000万个 ​ 近年来,随着移动互联网的普及和发展,微信作为国内最大的社交平台之一,已经成为人们日常生活中必不可少的工具。同时,…

嘉立创EDA专业版网络规则设置

在“设计规则”中的“规则管理”界面将PCB的各个设计规则如线宽规则、差分规则、过孔规则等设置完成之后,就需要将PCB中每个网络所对应的规则进行驱动,那么就可以设置“网络规则”。在“网络规则”中可以对当前PCB内的所有网络进行规则分配,继…

数字图像处理 基于傅里叶变换的图像拼接

一、简述 这里讨论的算法主要是指应用于基于相机拍摄的显微镜的2D图像的拼接。基于2D显微图像的拼接通常只考虑x、y方向的位移。 图像拼接在图像处理中应用广泛。特别是对高分辨率标本成像的需求日益增加。通常,这些标本不适合显微镜的视野。为了克服这一缺点,使用移动样品的…

泡泡玛特发布首支生态公益微纪录片 潮玩IP助力生物多样性保护

5月22日国际生物多样性日,泡泡玛特联合中国环境发布了首支生态公益微纪录片,通过潮玩艺术家AYAN和野生动物保护者初雯雯两个年轻人的故事,用一种全新的方式,唤起年轻人对动物保护和环境保护的关注。 AYAN的DIMOO与蒙新河狸 对于潮…

m1下git的客户端工具及idea配置

背景:换了m2以后,好多软件都不兼容,然后同步代码的事情就一直搁置了,今天记录一下如何用客户端工具同步代码和idea中配置远程仓库 第一步:下载github desktop,有针对m1芯片的,填写上你github的…

Java并发体系-锁与同步-[2]

可见性设计的硬件 从硬件的级别来考虑一下可见性的问题 **1、第一个可见性的场景:**每个处理器都有自己的寄存器(register),所以多个处理器各自运行一个线程的时候,可能导致某个变量给放到寄存器里去,接着…

【Java多线程案例】使用阻塞队列实现生产者消费者模型

前言 本篇文章讲解多线程案例之阻塞队列。主要讲解阻塞队列的特性、实际开发中常用的到的生产者消费者模型,以及生产者消费者模型解耦合、削峰填谷的好处。并且使用 Java 多线程模拟实现一个生产者消费者模型、阻塞队列版的生产者消费者模型。 文章从什么是阻塞队列…

12道c语言的课后习题!

1、计算n的阶乘&#xff08;1*2*3*4*5 n是个数&#xff0c;比如说乘到100&#xff1f;&#xff09; // 计算n的阶乘#include"stdio.h"int main() {int n 0;scanf("%d", &n);int i 0;int ret 1;for (i 1; i < n; i) {ret * i;}printf("…

技术分享| 融合会议协议大解密

anyRTC的融合会议解决方案中&#xff0c;支持H.323协议、SIP协议、GB28181国标协议、私有协议等等&#xff0c;实际在跟客户沟通时&#xff0c;我们常会被问到到底是SIP还是H.323好&#xff1f;客户前期已经建设了视频会议系统&#xff0c;有H.323的、有腾讯会议/Zoom这种互联网…

ESLint驼峰命名法规则校验关闭

目录 1、简单介绍ESLint1.1 ESLint是什么1.2 ESLint的好处1.3 ESLint的规范 2、 驼峰校验提示3、解决方案 1、简单介绍ESLint 1.1 ESLint是什么 ESLint 是一个代码检查工具&#xff0c;用来检查你的代码是否符合指定的规范 例如: 的前后必须有一个空格例如: 函数名后面必须…

郑州市元宇宙产业发展实施方案发布,中创助力元宇宙创新建设!

如果说2022年的“元宇宙”赛道&#xff0c;尚是以Meta为首&#xff0c;而今&#xff0c;政府也纷纷参与其中。 数据显示截至目前&#xff0c;国内已有至少30个地区&#xff08;涉及10个省级行政区&#xff09;颁布了元宇宙相关的支持性政策或征求意见稿&#xff0c;政策文件名中…

神策「数据闭环解决方案」重磅上线,3 大方向助推业务起飞

在通过数据驱动业务增长的落地实践中&#xff0c;企业大多面临以下困扰&#xff1a; 数据源多且杂乱&#xff0c;该如何从 0 开始积累数据助力业务决策&#xff1f; 如何借助数据的力量&#xff0c;洞察业务关键增长点&#xff1f; 如何提升运营效率&#xff1f;怎样提高用户的…