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

实战 Seata:实现分布式事务解决方案

实战 Seata:实现分布式事务解决方案

学习”黑马程序员SpringCloud微服务开发与实战,java黑马商城项目微服务实战开发“笔记记录

一、部署TC服务

Seata 中的 TC(事务协调器)是整个分布式事务的核心组件,用于管理全局事务的生命周期。我们可以通过多种方式部署 TC,这里我们推荐使用 Docker 方式部署。

1️⃣准备数据库表

Seata支持多种存储模式,但考虑到持久化的需要,我们一般选择基于数据库存储。

-- 创建 Seata 所需数据库表(MySQL 示例)
CREATE DATABASE seata;USE seata;-- 全局事务表
CREATE TABLE `global_table` (`xid` VARCHAR(128) NOT NULL,`transaction_id` BIGINT,`status` TINYINT NOT NULL,...PRIMARY KEY (`xid`)
);-- 分支事务表
CREATE TABLE `branch_table` (...
);-- undo_log 表(服务端与客户端都要用)
CREATE TABLE `undo_log` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT,`branch_id` BIGINT(20) NOT NULL,`xid` VARCHAR(100) NOT NULL,...PRIMARY KEY (`id`),UNIQUE KEY (`xid`, `branch_id`)
);

2️⃣准备配置文件

  1. 下载 Seata Server(GitHub Releases)
    在这里插入图片描述
  2. 解压后修改以下配置:
  • application.yml
server:port: 7099spring:application:name: seata-serverseata:config:# support: nacos, consul, apollo, zk, etcd3type: nacosnacos:server-addr: nacos:8848group : "DEFAULT_GROUP"namespace: ""dataId: "seataServer.properties"username: "nacos"password: "nacos"registry:# support: nacos, eureka, redis, zk, consul, etcd3, sofatype: nacosnacos:application: seata-serverserver-addr: nacos:8848group : "DEFAULT_GROUP"namespace: "f923fb34-cb0a-4c06-8fca-ad61ea61a3f0"username: "nacos"password: "nacos"
  • 配置数据库连接:
store:# support: file 、 db 、 redismode: dbsession:mode: dblock:mode: dbdb:datasource: druiddb-type: mysqldriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://mysql:3306/seata?rewriteBatchedStatements=trueuser: rootpassword: 123min-conn: 10max-conn: 100global-table: global_tablebranch-table: branch_tablelock-table: lock_tabledistributed-lock-table: distributed_lockquery-limit: 1000max-wait: 5000redis:mode: singledatabase: 0min-conn: 10max-conn: 100password:max-total: 100query-limit: 1000single:host: 192.168.150.101port: 6379

3️⃣Docker 部署 Seata Server

docker run -d --name seata-server \-p 8099:8099 \-p 7099:7099 \-e SEATA_IP=192.168.184.101 \-e SEATA_PORT=8091 \-v /your/path/registry.conf:/seata-server/resources/registry.conf \-v /your/path/file.conf:/seata-server/resources/file.conf \seataio/seata-server:1.7.0

二、微服务集成 Seata

1️⃣引入依赖

以 Nacos 为注册中心、MySQL 数据库为例:

<!--seata--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>

2️⃣改造配置

首先在nacos上添加一个共享的seata配置,命名为shared-seata.yaml
在这里插入图片描述

seata:registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址type: nacos # 注册中心类型 nacosnacos:server-addr: 192.168.184.101:8848 # nacos地址namespace: "" # namespace,默认为空group: DEFAULT_GROUP # 分组,默认是DEFAULT_GROUPapplication: seata-server # seata服务名称username: nacospassword: nacostx-service-group: hmall # 事务组名称service:vgroup-mapping: # 事务组与tc集群的映射关系hmall: "default"

在各个服务模块,添加bootstrap.yaml
- dataId: shared-seata.yaml # 共享seata配置
加载共享的seata配置

3️⃣添加数据库表

所有参与分布式事务的数据库都必须有 undo_log 表,支持 Seata 自动回滚。

CREATE TABLE IF NOT EXISTS `undo_log`
(`branch_id`     BIGINT       NOT NULL COMMENT 'branch transaction id',`xid`           VARCHAR(128) NOT NULL COMMENT 'global transaction id',`context`       VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',`rollback_info` LONGBLOB     NOT NULL COMMENT 'rollback info',`log_status`    INT(11)      NOT NULL COMMENT '0:normal status,1:defense status',`log_created`   DATETIME(6)  NOT NULL COMMENT 'create datetime',`log_modified`  DATETIME(6)  NOT NULL COMMENT 'modify datetime',UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDBAUTO_INCREMENT = 1DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table';

4️⃣使用

在业务服务中,通过注解控制事务:
@GlobalTransactional
在标记事务的起点,将来TM就会基于这个方法判断全局事务范围,初始化全局事务。

http://www.lryc.cn/news/611959.html

相关文章:

  • ORACLE进阶操作
  • 在NVIDIA Orin上用TensorRT对YOLO12进行多路加速并行推理时内存泄漏
  • 完整的登陆学生管理系统(配置数据库)
  • 电商支付异常测试全攻略
  • 013 HTTP篇
  • 秋招笔记-8.6
  • eclipse2023创建工作集
  • 使用python与streamlit构建的空间微生物分析
  • harbor仓库搭建(配置https)
  • 虚幻GAS底层原理解剖五 (AS)
  • 常见的大模型分类
  • #3:Maven进阶与私服搭建
  • 面试问题11
  • 用html写一个类似于postman可以发送请求
  • PyCharm vs. VSCode 到底哪个更好用
  • 面试题:基础的sql命令
  • 使用Nginx部署前后端分离项目
  • AS32S601 芯片 ADC 模块交流耦合测试:技术要点与实践
  • 大前端游戏应用中 AI 角色行为智能控制
  • AdGuard 安卓修改版:全方位广告拦截与隐私保护专家
  • webrtc弱网-OveruseFrameDetector源码分析与算法原理
  • Template 显式实例化 隐式实例化
  • C++之vector类的代码及其逻辑详解 (下)
  • java学习 leetcode24交换链表节点 200岛屿数量 +一些开发任务
  • win10/11网络防火墙阻止网络连接?【图文详解】防火墙阻止连接网络的解决方法
  • 最新教程 | CentOS 7 下 MySQL 8 离线部署完整手册(含自动部署脚本)
  • 【MyBatis新手避坑】详解 `Could not find resource ...Mapper.xml` 错误
  • 从博客到播客:文本转音频的全流程技术点
  • C++ - 仿 RabbitMQ 实现消息队列--网络通信协议设计
  • DOM的XML命名空间革命:从混乱到有序的蜕变