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

分布式事务Seata-AT模式

1. seata安装

  1. docker 安装
docker run --name seata-server \-p 8091:8091 \-p 7091:7091 \-e SEATA_IP=192.168.0.250 \-e SEATA_PORT=8091 \seataio/seata-server
  1. 将安装好的配置文件数据,拷贝一份到物理机
docker cp seata-serve:/seata-server/resources /User/seata/config
  1. 修改配置文件
server:port: 7091spring:application:name: seata-serverlogging:config: classpath:logback-spring.xmlfile:path: ${log.home:${user.home}/logs/seata}extend:logstash-appender:destination: 127.0.0.1:4560kafka-appender:bootstrap-servers: 127.0.0.1:9092topic: logback_to_logstashconsole:user:username: seatapassword: seata
seata:config:# support: nacos, consul, apollo, zk, etcd3type: nacosnacos:server-addr: 192.168.0.250:8848namespace:group: SEATA_GROUPusername: nacospassword: nacoscontext-path:##if use MSE Nacos with auth, mutex with username/password attribute#access-key:#secret-key:data-id: seataServer.propertiesregistry:# support: nacos, eureka, redis, zk, consul, etcd3, sofatype: nacosnacos:application: seata-serverserver-addr: 192.168.0.250:8848group: SEATA_GROUPnamespace:cluster: defaultusername: nacospassword: nacoscontext-path:store:# support: file 、 db 、 redismode: dbdb:datasource: druiddb-type: mysqldriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.0.250:3306/seata-work?rewriteBatchedStatements=true # 配置数据库服务端地址,提前初始化SQLuser: rootpassword: mysql_xMYB44min-conn: 10max-conn: 100global-table: global_tablebranch-table: branch_tablelock-table: lock_tabledistributed-lock-table: distributed_lockquery-limit: 1000max-wait: 5000security:secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017tokenValidityInMilliseconds: 1800000ignore:urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login
  1. 删除旧的seata-server,重新安装,并进行路径映射
docker run --name seata-server \-p 8091:8091 \-p 7091:7091 \-e SEATA_IP=192.168.0.250 \-e SEATA_PORT=8091 \-v /User/seata/config:/seata-server/resources  \seataio/seata-server

2. 数据库初始化

  1. 客户端
-- 注意此处0.3.0+ 增加唯一索引 ux_undo_log
CREATE TABLE `undo_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`branch_id` bigint(20) NOT NULL,`xid` varchar(100) NOT NULL,`context` varchar(128) NOT NULL,`rollback_info` longblob NOT NULL,`log_status` int(11) NOT NULL,`log_created` datetime NOT NULL,`log_modified` datetime NOT NULL,`ext` varchar(100) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
  1. 服务端
-- -------------------------------- The script used when storeMode is 'db' --------------------------------
-- the table to store GlobalSession data
CREATE TABLE IF NOT EXISTS `global_table`
(`xid`                       VARCHAR(128) NOT NULL,`transaction_id`            BIGINT,`status`                    TINYINT      NOT NULL,`application_id`            VARCHAR(32),`transaction_service_group` VARCHAR(32),`transaction_name`          VARCHAR(128),`timeout`                   INT,`begin_time`                BIGINT,`application_data`          VARCHAR(2000),`gmt_create`                DATETIME,`gmt_modified`              DATETIME,PRIMARY KEY (`xid`),KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(`branch_id`         BIGINT       NOT NULL,`xid`               VARCHAR(128) NOT NULL,`transaction_id`    BIGINT,`resource_group_id` VARCHAR(32),`resource_id`       VARCHAR(256),`branch_type`       VARCHAR(8),`status`            TINYINT,`client_id`         VARCHAR(64),`application_data`  VARCHAR(2000),`gmt_create`        DATETIME(6),`gmt_modified`      DATETIME(6),PRIMARY KEY (`branch_id`),KEY `idx_xid` (`xid`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(`row_key`        VARCHAR(128) NOT NULL,`xid`            VARCHAR(128),`transaction_id` BIGINT,`branch_id`      BIGINT       NOT NULL,`resource_id`    VARCHAR(256),`table_name`     VARCHAR(32),`pk`             VARCHAR(36),`status`         TINYINT      NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',`gmt_create`     DATETIME,`gmt_modified`   DATETIME,PRIMARY KEY (`row_key`),KEY `idx_status` (`status`),KEY `idx_branch_id` (`branch_id`),KEY `idx_xid` (`xid`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;CREATE TABLE IF NOT EXISTS `distributed_lock`
(`lock_key`       CHAR(20) NOT NULL,`lock_value`     VARCHAR(20) NOT NULL,`expire`         BIGINT,primary key (`lock_key`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);

3. Pom配置

        <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><exclusions><exclusion><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId></exclusion></exclusions></dependency><!-- 若版本加载不出来,则单独添加 --> <dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.7.1</version>  </dependency>

4. seata配置

# 配置seata
seata:enabled: truetx-service-group: xiaoqiu_tx_group # 事务组service:vgroup-mapping:xiaoqiu_tx_group: SEATA_GROUP # 事务组映射grouplist:SEATA_GROUP: 192.168.0.250:8091 # seata ip地址config:nacos:server-addr: 192.168.0.250:8848username: nacospassword: nacosregistry:nacos:server-addr: 192.168.0.250:8848username: nacospassword: nacos

5. 自动回滚

直接把原有的@Transactional替换成@GlobalTransactional即可

1. 当**本机发生异常,且未被全局异常处理器捕获时**,即可直接回滚;
2. 当**外部调用发生异常时,返回的状态码非200**,也可以直接回滚。

6. 手动回滚

  1. 外部异常,但返回状态码还是200

    调用外部接口时,外部接口自己捕获了异常,此时返回的http状态码为200,不会自动回滚,需要根据返回的数据单独判断,并进行手动回滚。

    举例:

    // 初始化简历
    R<Void> r = workResumeServiceFeign.init(user.getId());
    // 如果调用状态不是200,则手动回滚全局事务
    if (r.getStatus() != HttpStatusEnum.SUCCESS.getCode()) {String xid = RootContext.getXID();if (StringUtils.isNotBlank(xid)) {try {GlobalTransactionContext.reload(xid).rollback();} catch (TransactionException e) {log.error("createUsers, 回滚全局事务失败! mobile: {}", mobile, e);} finally {GraceException.display(ResponseStatusEnum.USER_REGISTER_ERROR);}}
    }
    
  2. 本地异常,但异常被全局异常捕获

    此时本地发生了异常,但是由于优雅处理异常的全局异常处理类,把异常吃掉了,所以需要单独处理。此时可以加一个AOP切面,对方法进行包装,手动的拦截要全局事务包裹的类,然后手动回滚异常。

    举例:

    异常代码:

    		@GlobalTransactional@Overridepublic Users createUsers(String mobile) {Users user = getDefaultUsers(mobile);user.setMobile(mobile);usersMapper.insert(user);// 初始化简历workResumeServiceFeign.init(user.getId());// 模拟除0异常int a = 1 / 0;return user;}
    

    切面:

    @Slf4j
    @Component
    @Aspect
    public class SeataTransactionAspect {/*** 调用service之前,手动加入或者创建全局事务*/@Before("execution(* com.xiaoqiu.service.impl.UsersServiceImpl.createUsers(..))")public void beginTransaction(JoinPoint joinPoint) throws TransactionException {log.info("手动开启全局事务");// 手动开启全局事务GlobalTransaction gt = GlobalTransactionContext.getCurrentOrCreate();gt.begin();}/*** 捕获异常,则手动回滚全局事务*/@AfterThrowing(throwing = "throwable",pointcut = "execution(* com.xiaoqiu.service.impl.UsersServiceImpl.createUsers(..))")public void seataRollback(Throwable throwable) throws Throwable {log.warn("捕获到异常信息,则回滚,异常信息为:{}", throwable.getMessage());// 从当前线程获得xidString xid = RootContext.getXID();if (StringUtils.isNotBlank(xid)) {GlobalTransactionContext.reload(xid).rollback();}}
    }
    

相关文章:

分布式事务Seata-AT模式

1. seata安装 docker 安装 docker run --name seata-server \-p 8091:8091 \-p 7091:7091 \-e SEATA_IP192.168.0.250 \-e SEATA_PORT8091 \seataio/seata-server将安装好的配置文件数据&#xff0c;拷贝一份到物理机 docker cp seata-serve:/seata-server/resources /User/…...

编程知识概览

编程&#xff0c;这个在现代社会中无处不在的词汇&#xff0c;已经从最初的计算机专业人士的专属技能&#xff0c;变成了许多人日常生活和工作中不可或缺的一部分。从简单的网页浏览、邮件发送&#xff0c;到复杂的游戏开发、数据分析&#xff0c;编程的应用几乎覆盖了所有领域…...

基于 GADF+Swin-CNN-GAM 的高创新扰动信号识别模型!

往期精彩内容&#xff1a; Python-电能质量扰动信号数据介绍与分类-CSDN博客 Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(二)基于CNN模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(三)基于Transformer的一…...

【Nextcloud】在 Ubuntu 22.04.3 LTS 上的 Nextcloud Hub 8 (29.0.0) 优化

[TOC](Nextcloud Hub 8 (29.0.0) 优化) Nextcloud 优化是个长期的过程&#xff0c;只能遇到问题解决问题了。遇到的问题和解决办法会逐步的编写完善。 打开 PHP 内存限制 伴随着内容增多&#xff0c;并添加更多的功能&#xff0c;访问 Nextcloud 变慢。通过修改PHP 内存限制&am…...

全渠道供应链打造中企业定制开发2+1链动模式S2B2C商城小程序的策略与影响

摘要&#xff1a;本文探讨了全渠道供应链打造对于零售企业的重要性及面临的挑战&#xff0c;着重分析了物流环节整合的难点&#xff0c;并以家电行业为例说明了节假日期间物流对企业经营的影响。同时&#xff0c;引入“企业定制开发21链动模式S2B2C商城小程序”这一关键因素&am…...

Github 2024-10-24 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-10-24统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Solidity项目1Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42421 个Fork数量:…...

中航资本:锂电行业现分化 优质产能仍然紧俏

2024年前三季度&#xff0c;受轻贱需求增速放缓影响&#xff0c;锂电工业堕入结构性供需错配&#xff0c;产品价格继续低迷&#xff0c;作业盈余全体承压。 当资料端不再稀缺&#xff0c;锂电作业由“卖方商场”转向“买方商场”&#xff0c;工业链博弈天平逐渐向轻贱倾斜。表…...

安宝特案例 | AR技术在院外心脏骤停急救中的革命性应用

00 案例背景 在院外心脏骤停 (OHCA) 的突发救援中&#xff0c;时间与效率直接决定着患者的生命。传统急救模式下&#xff0c;急救人员常通过视频或电话与医院医生进行沟通&#xff0c;以描述患者状况并依照指令行动。然而&#xff0c;这种信息传递方式往往因信息不完整或传递延…...

curl调用微信退款No required SSL certificate was sent

文章目录 前言一、错误一二、错误二 总结 前言 在之前的博客中提到微信证书到期了&#xff0c;需要更换&#xff0c;但是当我更换完证书自信满满的时候&#xff0c;却出现了两个问题&#xff0c;记录一下。 一、错误一 CURL Error: 58unable to load client key: -8178 (SEC_…...

进程守护SuperVisord内部的进程定时监测并重启

一个swoole的wensocket程序运行在SuperVisord下端口9503 设置一个每分钟任务监测9503的端口链接数&#xff0c;输出链接数&#xff0c;并在链接数为0的情况下重启wensocket进程。 以下截图是宝塔面板环境下 #!/bin/bash current$(date %H.%M) ws9503_procnumnetstat -nat | gre…...

[面试题]ES6 Javascript

ES6 箭头函数和普通函数有什么区别? 1)定义方式:箭头函数使用箭头(>)语法&#xff0c;省略了 function 关键字。 2)参数处理:如果只有一个参数&#xff0c;箭头函数可以省略括号。 3)函数体:如果函数体只有一条语句&#xff0c;箭头函数可以省略花括号和 return 关键字 4)…...

四款国内外远程桌面软件横测:ToDesk、向日葵、TeamViewer、AnyDesk

前言 远程桌面软件对于职场人来说并不陌生&#xff0c;可以说是必备的办公软件之一。在经历过新冠疫情后&#xff0c;大家对于远程办公的认识越来越深入&#xff0c;也就在这段期间&#xff0c;远程桌面软件大范围的应用起来&#xff0c;真正走进大众视野并融入我们的工作和生…...

解决电脑突然没有声音

问题描述&#xff1a;电脑突然没有声音了&#xff0c;最近没有怎么动过系统&#xff0c;没有安装或者卸载过什么软件&#xff0c;也没有安装或者卸载过驱动程序&#xff0c;怎么就没有声音了呢&#xff1f; 问题分析&#xff1a;仔细观察&#xff0c;虽然音量按钮那边看不到什…...

ZFX数字股票全球品牌战略新闻发布会在香港盛大举行

香港&#xff0c;2024年10月26日 —— 在香港这座东方之珠&#xff0c;ZFX集团今日在港岛 海逸君绰酒店隆重举办了“ZFX数字股票全球品牌战略新闻发布会暨世界佳 丽群星闪耀香港见面会”。作为全球数字金融领域的一次盛会&#xff0c;本次活动不 仅展示了ZFX集团在数字资产交易…...

vue中elementUI的el-select下拉框的层级太高修改设置!

项目场景&#xff1a; 项目中遇到一个问题&#xff0c;下拉框选择之后弹出一个弹出框选择数据再关闭。 问题就出在&#xff0c;我打开下拉框后再弹出弹出框&#xff0c;弹出框的 z-index 层级没有 select 的层级高&#xff0c;导致我弹框弹出了几个下拉框还在弹出框上面显示着…...

测试员最佳跳槽频率是多少?进来看看你是不是符合

最近笔者刷到一则消息&#xff0c;一位测试员在某乎上分享&#xff0c;从月薪5K到如今的20K&#xff0c;他总共跳了10次槽&#xff0c;其中还经历过两次劳动申诉&#xff0c;拿到了大几万的赔偿&#xff0c;被同事们称为“职场碰瓷人”。 虽说这种依靠跳槽式的挣钱法相当奇葩&…...

【数字信号处理】

https://www.bilibili.com/video/BV1B4421U79k/ 文章目录 1-绪论11-FFT1-绪论 1- Preliminery 引言 信号的概念,离散时间时域,频域2- 获得数字信号 采样,对信号的一种表达方式,是DSP的基础A/D,D/A 数字都是人造的,两个桥梁将现实和人造连接3-如何处理数字信号 两个工具:…...

Docker | 校园网上docker pull或者docker run失败的一种解决方法

场景 需要从仓库拉取镜像 无论使用命令docker pull 还是 docker run 但是总是显示如下的错误: 解决方法 查看虚拟机网络连接方式 Linux上检查校园网是否登录 有界面 无界面 只是命令行操作的Linux 关于Linux服务器端更新命令apt update没有效果问题总结(校园网认证)...

实现Java后端的图形验证码和行为验证码

登录添加图形验证码&#xff1a; 在 Java 中&#xff0c;我们可以使用一些图形处理库&#xff08;如 java.awt 和 javax.imageio&#xff09;生成图形验证码&#xff0c;并将验证码文本存储在会话&#xff08;session&#xff09;中以供验证。下面是一个完整的实现步骤&#x…...

事务的原理、MVCC的原理

事务特性 数据库事务具有以下四个基本特性&#xff0c;通常被称为 ACID 特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务被视为不可分割的最小工作单元&#xff0c;要么全部执行成功&#xff0c;要么全部失败回滚。这意味着如果事务执行过程中发生…...

Golang反射原理

Golang反射原理 Go语言中的反射机制是通过标准库中的reflect包实现的。反射允许程序在运行时检查变量的类型和值&#xff0c;甚至可以修改变量的值。以下是反射的基本原理和使用方法&#xff1a; 基本原理 类型和种类&#xff1a; 反射中的类型信息通过reflect.Type表示&…...

MATLAB计算朗格朗日函数

1. 朗格朗日函数介绍 朗格朗日函数&#xff08;Lagrange function&#xff09;通常用于优化问题&#xff0c;尤其是带有约束的优化问题。其一般形式为&#xff1a; 其中&#xff1a; f(x) 是目标函数。 是约束条件。 是拉格朗日乘子。 为了编写一个MATLAB代码来计算和绘制…...

嵌入式linux跨平台基于mongoose的TCP C++类的源码

嵌入式linux开发中&#xff0c;需要使用http服务器时&#xff0c;mongoose是个很好的选择&#xff0c;linux&#xff0c;win双平台都支持&#xff0c;代码全开放&#xff0c;简单明了&#xff0c;我非常喜欢这种尽在撑控中的感觉&#xff08;关于mongoose实现一个小型的http服务…...

入驻商家必看:如何在TikTok实现多店铺高效上货及运营?

TikTok作为跨境电商平台之一&#xff0c;越来越多人进入其电商赛道——TikTok Shop&#xff0c;运营者想要长远发展&#xff0c;了解平台的政策动向并进行调整店铺至关重要。本文整理了TikTok Shop降低入驻门槛的资讯&#xff0c;并为广大TikTok电商运营者提供实用、有效的开店…...

spring-boot-starter-data-redis

一、几个依赖的关系 在spring与redis整合时有下面几种&#xff1a; spring-boot-starter-data-redis spring-boot-starter-redis spring-data-redis 其中&#xff0c;spring-boot-starter-data-redis和spring-boot-starter-redis中都包含有spring-data-redis&#xff0c; 现在…...

科研绘图神器:机制图、模式图有哪些好用的工具推荐?

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 最近不少学员在问科研绘图相关的问题。前面娜姐介绍过AI辅助绘图的方法和思路&#xff1a; 顶刊的图文摘要Graphical Abstract&#xff0c;如何巧用AI绘制&#xff1f; 目前…...

DIFFUSIONSAT: A GENERATIVE FOUNDATION MODEL FOR SATELLITE IMAGERY(2024-ICLR)

论文&#xff1a;DIFFUSIONSAT: A GENERATIVE FOUNDATION MODEL FOR SATELLITE IMAGERY(2024-ICLR) 习惯用飞书做笔记了&#xff0c;大家见谅 Diffusionsat&#xff1a;卫星图像生成基础模型...

文件中台与安全:集成方案的探索与实践

在企业数字化转型加速的今天&#xff0c;文件中台已成为支撑数据共享与高效协作的关键基础设施。然而&#xff0c;随着企业文件需求的增多和内容复杂性的提升&#xff0c;文件的安全问题也日益突显。如何在构建强大文件中台的同时&#xff0c;保障文件数据的安全性&#xff0c;…...

Redis 哨兵 总结

前言 相关系列 《Redis & 目录》《Redis & 哨兵 & 源码》《Redis & 哨兵 & 总结》《Redis & 哨兵 & 问题》 参考文献 《Redis的主从复制和哨兵机制详解》《Redis中的哨兵&#xff08;Sentinel&#xff09;》《【Redis实现系列】Sentinel自动故…...

Systemd 和 Systemctl命令详解

Systemd 和 Systemctl命令详解 在现代 Linux 系统中&#xff0c;systemd 是一种高度灵活且广泛应用的系统管理工具。它主要负责系统引导和进程管理&#xff0c;支持并行化启动服务&#xff0c;并提供高级的服务管理和依赖控制。systemctl 是 systemd 的核心命令行工具&#xf…...

在线单页网站制作/大数据培训机构排名前十

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼-所有的错误就是这样啊&#xff0c;你的可以&#xff1f;那我就不懂了&#xff01;-------------------Configuration: SDF - Win32 Debug--------------------Compiling...SDF.cc:\windows\system32\sdf.c(5) : error C2143: synt…...

网站速成/微信crm客户管理系统

PLAN_HASH_VALUE: 反应sql的执行计划&#xff0c;如果不同的sql的 PLAN_HASH_VALUE 相同&#xff0c;则表示这些sql的执行计划相同。 HASH_VALUE:sql_id的后几位的一个值&#xff0c;因此不同的sql 的HASH_VALUE 也可能相同。 sql_id&#xff1a;能够唯一标示一条sql versi…...

2018网站内容和备案/太原互联网推广公司

一. 环境准备 1.1 主库环境(172.168.18.201) 环境 说明 查看脚本 操作系统版本 CentOS Linux release 7.4.1708 (Core) cat /etc/redhat-release 操作系统用户名和密码 root js*2015 IP地址 172.168.18.201 ip addr 网关Gateway 172.168.18.1 cat /etc/syscon…...

做标书的视频网站/百度搜索排行榜

在cmd控制台内&#xff0c;vue -V 可看到vue-cli脚手架的版本号&#xff0c;现在好多帖子误写成vue版本号。 如下图&#xff1a; vue版本号在项目中,找到package.json文件夹 找"dependencies"中的vue后面的版本号&#xff0c;如下图所示。...

做推广可以上那些网站/爱站小工具

1. 指令的概念 指令&#xff08;Directives&#xff09;是 vue 为开发者提供的模板语法&#xff0c;用于辅助开发者渲染页面的基本结构。 vue 中的指令按照不同的用途可以分为如下 6 大类&#xff1a; ① 内容渲染指令 1. v-text 指令的缺点&#xff1a;会覆盖元素内部原有…...

如何做代刷网站长/百度竞价排名怎么做

“ 小镇青年&#xff0c;新消费主战场。” 作者 | 颜艳春 美编 | 刘畅 原文链接 https://www.sohu.com/a/230428451_465522 ▼ 人生最有诗情画意的年代莫过于青年时代&#xff0c;青年时的精华莫过于青春。青春是人生最美的季节&#xff0c;它犹如含苞欲放…...