Seata框架 分布式事务实战 Demo-1

以下是一个基于 Seata框架 的分布式事务实战 Demo,使用 AT模式(Automatic Transaction) 实现类似 3PC 的效果。AT 模式是 Seata 的核心模式,结合了 2PC 和乐观锁,通过自动记录 Undo Log 实现高效回滚。


环境准备

  1. 下载 Seata Server
    访问 Seata官网 下载最新版(以 2.1.0 为例),解压后启动:

    # 启动 TC(Transaction Coordinator)
    sh seata-server.bat -p 8091 -h 127.0.0.1# 启动 TM(Transaction Manager)和 RM(Resource Manager)
    sh seata-server.bat -p 8092 -h 127.0.0.1
    
  2. 配置数据库
    创建 MySQL 数据库并初始化 undo_log 表(Seata 回滚依赖):

    CREATE DATABASE seata_order DEFAULT CHARSET=utf8mb4;
    USE seata_order;CREATE TABLE `order` (`id` BIGINT PRIMARY KEY AUTO_INCREMENT,`user_id` VARCHAR(50),`amount` DECIMAL(10,2),`status` ENUM('CREATED', 'COMMITTED', 'ROLLED_BACK') DEFAULT 'CREATED'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `inventory` (`sku` VARCHAR(50) PRIMARY KEY,`stock` INT DEFAULT 100
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- undo_log 表(Seata 自动创建)
    CREATE TABLE `undo_log` (`branch_transaction_id` BIGINT PRIMARY KEY,`xid` VARCHAR(100),`rollback_info` LONGBLOB,`log_table_name` VARCHAR(100),`log_table_column` VARCHAR(100),`log_key` VARCHAR(200),`timestamp` DATETIME DEFAULT CURRENT_TIMESTAMP
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
  3. 注册中心与服务发现
    使用 Nacos 作为注册中心,启动 Nacos Server 并配置 Seata Server 的 application.yml

    # seata-server/config/application.yml
    spring:application:name: seata-serverdatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/seata_order?useSSL=false&serverTimezone=UTCusername: rootpassword: rootregistry:type: nacosnacos:server-addr: 127.0.0.1:8848config:center:type: nacosnacos:server-addr: 127.0.0.1:8848
    

Spring Boot 项目集成 Seata

1. 添加依赖

pom.xml 中添加 Seata 和 MySQL 驱动依赖:

<dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>2.1.0</version>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.8</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope>
</dependency>
2. 配置数据源代理

application.yml 中配置 Seata 数据源代理:

spring:datasource:url: jdbc:mysql://localhost:3306/seata_order?useSSL=false&serverTimezone=UTCusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourcedruid:max-active: 20seata:tx-service-group: my_test_tx_groupenable-auto-commit: falseservice-component:tx-manager:service-name: seata-tm-serviceregister-center:type: nacosnacos:server-addr: 127.0.0.1:8848tx-coordinator:service-name: seata-tc-serviceregister-center:type: nacosnacos:server-addr: 127.0.0.1:8848
3. 启用全局事务注解

在启动类上添加 @EnableSeataTx 注解:

@SpringBootApplication
@EnableSeataTx
public class SeataOrderApplication {public static void main(String[] args) {SpringApplication.run(SeataOrderApplication.class, args);}
}

业务代码实现

1. 订单服务(OrderService)
@Service
public class OrderService {@Autowiredprivate OrderDAO orderDAO;@Autowiredprivate InventoryService inventoryService;@Autowiredprivate PaymentService paymentService;@GlobalTransactional(timeout=30000, name="createOrder", rollbackFor=Exception.class)public void createOrder(Order order) {// 1. 扣减库存inventoryService.deduct(order.getSkuId());// 2. 扣款(支付服务调用)paymentService.charge(order.getUserId(), order.getAmount());// 3. 生成订单orderDAO.insert(order);}
}
2. 库存服务(InventoryService)
@Service
public class InventoryService {@Autowiredprivate InventoryDAO inventoryDAO;@Transactionalpublic void deduct(String sku) {Inventory inventory = inventoryDAO.findBySku(sku);if (inventory.getStock() <= 0) {throw new RuntimeException("库存不足,SKU: " + sku);}inventory.setStock(inventory.getStock() - 1);inventoryDAO.update(inventory);}
}
3. 支付服务(PaymentService)
@Service
public class PaymentService {@Autowiredprivate PaymentDAO paymentDAO;@Transactionalpublic void charge(String userId, BigDecimal amount) {Payment payment = paymentDAO.findByUserId(userId);if (payment == null) {throw new RuntimeException("用户未找到,ID: " + userId);}payment.setBalance(payment.getBalance().subtract(amount));paymentDAO.update(payment);}
}

4. 数据库操作类

OrderDAO
@Repository
public class OrderDAO {@Autowiredprivate JdbcTemplate jdbcTemplate;public void insert(Order order) {String sql = "INSERT INTO `order` (user_id, amount, status) VALUES (?, ?, 'CREATED')";jdbcTemplate.update(sql, order.getUserId(), order.getAmount());}
}
InventoryDAO
@Repository
public class InventoryDAO {@Autowiredprivate JdbcTemplate jdbcTemplate;public Inventory findBySku(String sku) {String sql = "SELECT * FROM `inventory` WHERE sku = ?";return jdbcTemplate.queryForObject(sql, Inventory.class, sku);}public void update(Inventory inventory) {String sql = "UPDATE `inventory` SET stock = ? WHERE sku = ?";jdbcTemplate.update(sql, inventory.getStock(), inventory.getSku());}
}

5. 测试与验证

1. 触发全局事务

创建 OrderController 提供测试接口:

@RestController
@RequestMapping("/orders")
public class OrderController {@Autowiredprivate OrderService orderService;@PostMapping("/create")public String createOrder(@RequestBody Order order) {try {orderService.createOrder(order);return "订单创建成功!";} catch (Exception e) {return "订单创建失败:" + e.getMessage();}}
}
2. 模拟失败场景

PaymentService 中故意抛出异常:

public void charge(String userId, BigDecimal amount) {// 模拟支付失败if (Math.random() > 0.5) {throw new RuntimeException("支付失败!");}// 正常逻辑...
}
3. 验证回滚

成功场景:所有服务正常,订单提交成功。
失败场景:支付失败,触发全局回滚:
• 库存恢复(inventory 表的 stock 加回)。
• 订单状态保持为 CREATED
• 支付记录未提交(需手动回滚,由 Seata 自动处理)。


关键原理与优势

1. Seata AT模式的核心流程

阶段一(Branch Registration)
• TM(订单服务)启动全局事务,向 TC 注册分支事务。
阶段二(Local Transaction)
• 各个 RM(库存、支付、订单服务)执行本地事务,自动记录 Undo Log。
阶段三(Commit/Rollback)
• TC 收集所有分支事务状态,决定提交或回滚:
◦ 提交:各 RM 提交本地事务。
◦ 回滚:通过 Undo Log 恢复数据。

2. 优势对比传统2PC

无代码侵入:通过注解 @GlobalTransactional 简化开发。
高性能:基于乐观锁和异步通信,减少同步阻塞。
自动补偿:无需手动编写补偿逻辑(如 TCC 的 Cancel 方法)。


常见问题与解决

1. 事务未提交/回滚

检查点
• 确保 @GlobalTransactional 注解正确标注在 TM 方法上。
• 确认 Seata Server 和 Nacos 服务正常运行。

2. 数据不一致

解决方案
• 检查 undo_log 表是否正常记录回滚信息。
• 验证本地事务的 @Transactional 是否生效。

3. 超时问题

调整配置
• 在 application.yml 中设置 global.tx.timeout=30000(默认 30 秒)。
• 优化业务逻辑,减少事务执行时间。


总结

通过 Seata 的 AT 模式,我们无需手动实现复杂的 2PC 或 3PC 协议,即可轻松获得分布式事务的强一致性保障。其核心优势在于:
开发成本低:注解驱动,减少模板代码。
高性能:异步回滚机制,降低资源阻塞。
高可用:集群化部署,避免单点故障。

适用场景
• 电商订单、金融转账等需要强一致性的场景。
• 微服务架构中需跨服务事务的场景。

进阶方向
• 结合 Saga 模式处理长事务。
• 通过 Seata 的 @Compensable 注解实现自定义补偿逻辑。

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

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

相关文章

图解AUTOSAR_CP_EEPROM_Abstraction

AUTOSAR EEPROM抽象模块详细说明 基于AUTOSAR标准的EEPROM抽象层技术解析 目录 1. 概述 1.1 核心功能1.2 模块地位2. 架构概览 2.1 架构层次2.2 模块交互3. 配置结构 3.1 主要配置容器3.2 关键配置参数4. 状态管理 4.1 基本状态4.2 状态转换5. 接口设计 5.1 主要接口分类5.2 接…

【AI Infra】【RLHF框架】二、VeRL中colocate实现解析

​ colocate的作用是使多个Worker共享相同的资源池。当然&#xff0c;目前verl中所有模型的Worker都共享相同的资源池:global_pool。这篇博客主要通过例子和源代码理解verl中colocate的实现&#xff0c;需要一些前置知识。建议先阅读 【AI Infra】【RLHF框架】一、VeRL中基于R…

PostgreSQL_数据表结构设计并创建

目录 前置&#xff1a; 1 数据表设计思路 2 数据表格SQL 3 创建 3.1 创建数据库 db_stock 3.2 在 pgAdmin4 中创建表 前置&#xff1a; 本博文是一个系列。在本人“数据库专栏”-》“PostgreSQL_”开头的博文 1 数据表设计思路 1 日数据来自优矿&#xff0c;优矿的数据…

植物来源药用天然产物的合成生物学研究进展-文献精读121

植物来源药用天然产物的合成生物学研究进展 摘要 大多数药用天然产物在植物中含量低微&#xff0c;提取分离困难&#xff1b;而且这些化合物一般结构复杂&#xff0c;化学合成难度大&#xff0c;还容易造成环境污染。基于合成生物学技术获得药用天然产物具有绿色环保和可持续发…

Nordic nRF 蓝牙的 Direct Test Mode (DTM) 测试介绍

目录 概述 1. 核心物理层参数 1.1 射频频率 (RF Channel Frequency) 1.2 发射功率 (TX Power) 1.3 调制方式 (Modulation) 1.4 数据包类型 (Packet Type) 1.5 测试模式 (Test Mode) 2. 参数配置方法 2.1 通过 HCI 命令配置 2.2 示例&#xff08;nRF52 系列&#xff0…

区间震荡指标

区间震荡指标的逻辑如下&#xff1a; 一、函数注解 1. Summation函数 功能&#xff1a; 计算给定价格序列Price的前Length个数据点的和&#xff0c;或在数据点数量超过Length时&#xff0c;计算滚动窗口内的价格和。 参数&#xff1a; Price(1)&#xff1a;价格序列&#…

文章防洗稿隐蔽混淆软件

如果你的文章经常被人洗稿搬运&#xff0c;那么这个小工具或许可以帮到你 基本原理: 在文章的每个字后面&#xff0c;加上一些随机的隐藏字符 人眼看不到&#xff0c;但是机器会读取到&#xff0c;如果别人是用AI工具来对你的文章进行洗稿&#xff0c;就会发现这是一堆乱码 你…

车载软件架构 --- AUTOSAR AP/CP中诊断的区别

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 周末洗了一个澡&#xff0c;换了一身衣服&#xff0c;出了门却不知道去哪儿&#xff0c;不知道去找谁&am…

百度OCR调用记录

根据说明&#xff0c;调用测试 设置注册的API Key和Secret Key 调用类&#xff08;官方文档中有&#xff09; 这里改传入路径&#xff1b; 测试问题 1.{"error_code":110,"error_msg":"Access token invalid or no longer valid"} 查到说是 …

19.哈希表的实现

1.哈希的概念 哈希(hash)⼜称散列&#xff0c;是⼀种组织数据的⽅式。从译名来看&#xff0c;有散乱排列的意思。本质就是通过哈希函数把关键字Key跟存储位置建⽴⼀个映射关系&#xff0c;查找时通过这个哈希函数计算出Key存储的位置&#xff0c;进⾏快速查找。 1.2.直接定址法…

网络编程之解除udp判断客户端是否断开

思路&#xff1a;每几秒发送一条不显示的信息&#xff0c;客户端断开则不再发送信息&#xff0c;超时则表示客户端断开连接。&#xff08;心跳包&#xff09; 服务器 #include <head.h>#define MAX_CLIENTS 100 // 最大支持100个客户端 #define TIMEOUT 5 // 5秒…

Java 大视界 -- Java 大数据在智能医疗远程会诊与专家协作中的技术支持(146)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

调用feapder作为子程序时setting.py文件不起作用

feaper 官方文档地址&#xff1a; 简介及安装 - feapder官方文档|feapder-document 问题&#xff1a; 在最近的开发中需要调用feapder作为主程序调用的子程序时发现自动入库时无法入库&#xff0c;通过查看日志信息发现连接数据库时被拒绝连接了&#xff0c;但是我的setting.p…

【STM32】SPI通信协议W25Q64Flash存储器芯片(学习笔记)

通信接口部分有介绍SPI&#xff1a;【STM32】USART串口协议&串口外设-学习笔记-CSDN博客 SPI通信协议 SPI通信 SPI&#xff08;Serial Peripheral Interface&#xff09;是由Motorola公司开发的一种通用数据总线四根通信线&#xff1a;SCK&#xff08;Serial Clock&…

刘强东突然发声:不该用算法压榨最底层兄弟!东哥,真正的人民企业家

今天忙了一天&#xff0c;很累&#xff0c;准备睡觉的时候&#xff0c;看到网上盛传的刘强东的朋友圈&#xff0c;东哥又在朋友圈发文了。 说实话&#xff0c;看完之后&#xff0c;感动&#xff0c;真的感动。 尤其是当我看到这两句话的时候。 1、我们所学的知识、商业模式、技…

Maven安装与环境配置

首先我们先介绍一些关于Maven的知识&#xff0c;如果着急直接看下面的安装教程。 目录 Maven介绍 Maven模型 Maven仓库 Maven安装 下载 安装步骤 Maven介绍 Apache Maven是一个项目管理和构建工具&#xff0c;它基于项目对象模型(Project Object Model , 简称: POM)的概念…

C++ 语法之数组指针

一维数组&#xff1a; 如果我们定义了一个一维数组&#xff0c;那么这个数组名&#xff0c;就是指向第一个数组元素的地址&#xff0c;也即&#xff0c;是整个数组分配的内存空间的首地址。 比如 int a[3]; 定义了一个包含三个元素的数组。因为一个int占4个字节&#xff0c;那…

021-TCMalloc

TCMalloc 以下是对TCMalloc的技术调研报告&#xff0c;结合原理、代码实现、优化参数及性能对比的综合分析&#xff1a; 一、TCMalloc核心原理 架构分层 TCMalloc采用三级缓存结构&#xff0c;具体流程参考下图&#xff1a; ┌─────────────┐ ┌───…

华为网路设备学习-16 虚拟路由器冗余协议(VRRP)

VRRP是针对干线上三层网络设备&#xff08;如&#xff1a;路由器、防火墙等&#xff09;的网络虚拟化技术&#xff0c;提供冗余和状态监测等功能。确保在网络中的单点故障发生时&#xff0c;能够快速切换到备份设备&#xff0c;从而保证网络通信的连续性和可靠性。‌ VRRP通过…

【华为Pura先锋盛典】华为Pura X“阔折叠”手机发布:首次全面搭载HarmonyOS 5

文章目录 前言一、阔感体验&#xff0c;大有不同二、鸿蒙AI&#xff0c;大有智慧三、便携出行&#xff0c;大有不同四、首款全面搭载 HarmonyOS 5 的手机五、卓越性能&#xff0c;可靠安心六、红枫影像&#xff0c;大放光彩预热&#xff1a;鸿蒙电脑HarmonyOS 5 升级计划小结 前…