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

Spring集成Seata

Seata的集成方式有:

1. Seata-All

2. Seata-Spring-Boot-Starter

3. Spring-Cloud-Starter-Seata

本案例使用Seata-All演示:

第一步:下载Seata

第二步:为了更好看到效果,我们将Seata的数据存储改为db

将seata\script\server\db\mysql.sql语句在mysql中执行,创建相关表

 

 然后修改seata配置文件,相关配置可以参考application.example.yml,此处修改mode为db并且配置db相关配置

启动seata:

 第三步:开始集成Seata

1.在我们的项目pom.xml引入seata包(1.5.x有bug,我们使用1.4.2)

<!--seata-->
<dependency><groupId>io.seata</groupId><artifactId>seata-all</artifactId> 
</dependency>
<dependency><groupId>com.esotericsoftware</groupId><artifactId>kryo</artifactId>
</dependency>
<dependency><groupId>de.javakaffee</groupId><artifactId>kryo-serializers</artifactId>
</dependency>

2.application.properties

#环境配置
spring.profiles.active=devspring.application.name=user-service-provider
dubbo.application.id=user-service
dubbo.application.name=user-service#dubbo.protocol.port=-1
#dubbo.protocol.name=dubbo#多协议支持
dubbo.protocols.tri.name=tri
dubbo.protocols.tri.port=-1
dubbo.protocols.tri.id=tridubbo.protocols.dubbo.name=dubbo
dubbo.protocols.dubbo.port=-1
dubbo.protocols.dubbo.id=dubbo
#序列化方式
dubbo.protocols.dubbo.serialization=kryodubbo.application.logger=log4j
#调用信息跟踪-log4j 日志
#dubbo.protocol.accesslog=true
#调用信息跟踪-将访问日志输出到指定文件
#dubbo.protocol.accesslog=/log/access.log#是否简化 url
#dubbo.registry.simplified=true
#dubbo.registry.id=zk-registry
#dubbo.registry.address=zookeeper://192.168.1.105:2181?timeout=20000
#dubbo.config-center.address=zookeeper://192.168.1.105:2181?timeout=20000
#dubbo.metadata-report.address=zookeeper://192.168.1.105:2181?timeout=20000
#多注册中心
#dubbo.registries.zk-registry.id=zk-registry
#dubbo.registries.zk-registry.address=zookeeper://192.168.1.105:2181?timeout=20000&blockUntilConnectedWait=30
dubbo.registries.nacos-registry.id=nacos-registry
dubbo.registries.nacos-registry.address=nacos://192.168.1.105:8848
#dubbo.registries.nacos-registry.address=nacos://192.168.1.105:8848?namespace=2e73933a-34d4-4fba-b21e-f08cd9b8adc9
dubbo.registry.use-as-config-center=false
dubbo.registry.use-as-metadata-center=false#nacos配置中心
nacos.config.server-addr=192.168.1.105:8848#mybatis
mybatis.mapper-locations= classpath*:com/lee/demo/dubbo/demo/dao/*Mapper.xml
mybatis.type-aliases-package=com.lee.demo.dubbo.demo.entity#datasource
spring.datasource.url=jdbc:mysql://localhost:3308/coupon-platform?useUnicode=true&characterEncoding=utf8&useOldAliasMetadataBehavior=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=Aa1225102411
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

3.在resources目录下添加配置文件file.conf和registry.conf,seata会扫描这两个配置文件从而获取相关配置。

registry.conf:

registry {# file 、nacos 、eureka、redis、zk、consul、etcd3、sofatype = "file"file {name = "file.conf"}
}config {# file、nacos 、apollo、zk、consul、etcd3type = "file"file {name = "file.conf"}
}

file.conf:

transport {# tcp, unix-domain-sockettype = "TCP"#NIO, NATIVEserver = "NIO"#enable heartbeatheartbeat = true# the tm client batch send request enableenableTmClientBatchSendRequest = false# the rm client batch send request enableenableRmClientBatchSendRequest = true# the rm client rpc request timeoutrpcRmRequestTimeout = 2000# the tm client rpc request timeoutrpcTmRequestTimeout = 10000# the tc client rpc request timeoutrpcTcRequestTimeout = 5000#thread factory for nettythreadFactory {bossThreadPrefix = "NettyBoss"workerThreadPrefix = "NettyServerNIOWorker"serverExecutorThread-prefix = "NettyServerBizHandler"shareBossWorker = falseclientSelectorThreadPrefix = "NettyClientSelector"clientSelectorThreadSize = 1clientWorkerThreadPrefix = "NettyClientWorkerThread"# netty boss thread sizebossThreadSize = 1#auto default pin or 8workerThreadSize = "default"}shutdown {# when destroy server, wait secondswait = 3}serialization = "seata"compressor = "none"
}
service {#transaction service group mappingvgroupMapping.demo-tx-default-group = "default"#only support when registry.type=file, please don't set multiple addressesdefault.grouplist = "192.168.8.133:8091"#degrade, current not supportenableDegrade = false#disable seatadisableGlobalTransaction = false
}client {rm {asyncCommitBufferLimit = 10000lock {retryInterval = 10retryTimes = 30retryPolicyBranchRollbackOnConflict = true}reportRetryCount = 5tableMetaCheckEnable = falsetableMetaCheckerInterval = 60000reportSuccessEnable = falsesagaBranchRegisterEnable = falsesagaJsonParser = "fastjson"sagaRetryPersistModeUpdate = falsesagaCompensatePersistModeUpdate = falsetccActionInterceptorOrder = -2147482648 #Ordered.HIGHEST_PRECEDENCE + 1000}tm {commitRetryCount = 5rollbackRetryCount = 5defaultGlobalTransactionTimeout = 60000degradeCheck = falsedegradeCheckPeriod = 2000degradeCheckAllowTimes = 10interceptorOrder = -2147482648 #Ordered.HIGHEST_PRECEDENCE + 1000}undo {dataValidation = trueonlyCareUpdateColumns = truelogSerialization = "kryo"logTable = "undo_log"compress {enable = true# allow zip, gzip, deflater, 7z, lz4, bzip2, zstd default is ziptype = zip# if rollback info size > threshold, then will be compress# allow k m g tthreshold = 64k}}loadBalance {type = "RandomLoadBalance"virtualNodes = 10}
}
log {exceptionRate = 100
}
tcc {fence {# tcc fence log table namelogTableName = tcc_fence_log# tcc fence log clean periodcleanPeriod = 1h}
}

4.编写Seata全局事务扫描器配置类SeataTransctionConfig:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import io.seata.spring.annotation.GlobalTransactionScanner;@Configuration
public class SeataTransctionConfig {@Beanpublic GlobalTransactionScanner globalTransactionScanner() {String txServiceGroup = "demo-tx-default-group";return new GlobalTransactionScanner(txServiceGroup);}}

注意:在file.conf中的service配置要和SeataTransctionConfig 中指定的txServiceGroup 一致

5. 由于AT模型是使用本地undo_log进行回滚,因此,我们每个事务所在的数据库中需要添加该表

在seata github中有样板,链接:https://github.com/seata/seata/tree/develop/srcipt/client/at/db

其中mysql.sql如下: 

-- ----------------------------
-- Table structure for undo_log
-- ----------------------------
DROP TABLE IF EXISTS `undo_log`;
CREATE TABLE `undo_log`  (`branch_id` bigint NOT NULL COMMENT 'branch transaction id',`xid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'global transaction id',`context` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'undo_log context,such as serialization',`rollback_info` longblob NOT NULL COMMENT 'rollback info',`log_status` int 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 INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'AT transaction mode undo table' ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of undo_log
-- ----------------------------

 

 测试:

在抛异常之前打断点,查看数据是否成功插入过:

看到记录插入成功,并且undo_log中记录了这两个事务的日志:

断点继续往下走,触发异常,,已插入的数据被回滚,且undo_log被清空,分布式事务回滚正常。

 

至此,Spring集成Seata演示完毕

相关文章:

Spring集成Seata

Seata的集成方式有&#xff1a; 1. Seata-All 2. Seata-Spring-Boot-Starter 3. Spring-Cloud-Starter-Seata 本案例使用Seata-All演示&#xff1a; 第一步&#xff1a;下载Seata 第二步&#xff1a;为了更好看到效果&#xff0c;我们将Seata的数据存储改为db 将seata\sc…...

三种方式创建对象的几种方式及new实例化时做了什么?

创建对象的几种方式 利用对象字面量创建对象 const obj {}2.利用 new Object创建对象 const obj new Object()3.使用 构造函数实例化对象 function Fn(name) {this.name name} const obj new Fn(张三) console.log(obj.name); //张三为什么要用构造函数的形式&#xff1…...

vue2-vue实例挂载的过程

1、思考 new Vue()这个过程中究竟做了什么&#xff1f;过程中是如何完成数据的绑定&#xff0c;又是如何将数据渲染到视图的等等。 2、分析 首先找到vue的构造函数。 源码位置&#xff1a;/src/core/instance/index.js options是用户传递过来的配置项&#xff0c;如data、meth…...

C++ 右值引用案例

C 右值引用案例 右值引用&#xff08;Rvalue reference&#xff09;是 C11 引入的新特性&#xff0c;它的主要意义是实现移动语义&#xff08;Move semantics&#xff09;和完美转发&#xff08;Perfect forwarding&#xff09;。这两者都可以提高代码的性能和灵活性。 一、移…...

2.文件的逻辑结构

第四章 文件管理 2.文件的逻辑结构 顺序文件采用顺序存储则意味着各个逻辑上相邻的记录在物理上也是相邻的存储的。所以如果第0号记录的逻辑地址为0的话&#xff0c;则i号记录的逻辑为i *L。 特别的如果这个定长记录的顺序文件采用串结构&#xff0c;也就是这些记录的顺序和他…...

20天学rust(一)和rust say hi

关注我&#xff0c;学习Rust不迷路 工欲善其事&#xff0c;必先利其器。第一节我们先来配置rust需要的环境和安装趁手的工具&#xff0c;然后写一个简单的小程序。 安装 Rust环境 Rust 官方有提供一个叫做 rustup 的工具&#xff0c;专门用于 rust 版本的管理&#xff0c;网…...

牢记这16个SpringBoot 扩展接口,写出更加漂亮的代码

1、背景 Spring的核心思想就是容器&#xff0c;当容器refresh的时候&#xff0c;外部看上去风平浪静&#xff0c;其实内部则是一片惊涛骇浪&#xff0c;汪洋一片。Springboot更是封装了Spring&#xff0c;遵循约定大于配置&#xff0c;加上自动装配的机制。很多时候我们只要引…...

c++两种设计模式 单例和工厂模式

c两种设计模式 单例和工厂模式 一.单例 1.单例的概念 1.当前的类最多只能创建一个实例 2.当前这个唯一的实例&#xff0c;必须由当前类创建&#xff08;自主创建&#xff09;&#xff0c;而不是调用者创建 3.必须向整个系统提供全局的访问点&#xff0c;来获取唯一的实例 …...

2023-08-05——JVM 栈

栈 stack 栈&#xff1a;数据结构 程序数据结构算法 栈&#xff1a;先进后出&#xff0c;后进先出 好比一个&#xff1a;桶 队列&#xff1a;先进先出&#xff08;FIFO &#xff1a;First Input First Out&#xff09; 好比一个&#xff1a;管道 栈&#xff1a;喝多了吐。队列…...

Camera之PhysicalCameraSettingsList/SurfaceMap/CameraMetadata/RequestList的关系(三十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…...

【ONE·Linux || 基础IO(二)】

总言 文件系统与动静态库相关介绍。 文章目录 总言2、文件系统2.1、背景知识2.2、磁盘管理2.2.1、磁盘文件系统图2.2.2、inode与文件名 2.3、软硬链接 3、动静态库3.1、站在编写库的人的角度&#xff1a;如何写一个库&#xff1f;3.1.1、静态库制作3.1.3、动态库制作 3.2、站在…...

【LeetCode 算法】Power of Heroes 英雄的力量

文章目录 Power of Heroes 英雄的力量问题描述&#xff1a;分析代码Math Tag Power of Heroes 英雄的力量 问题描述&#xff1a; 给你一个下标从 0 开始的整数数组 nums &#xff0c;它表示英雄的能力值。如果我们选出一部分英雄&#xff0c;这组英雄的 力量 定义为&#xff…...

合宙Air724UG LuatOS-Air script lib API--ntp

ntp Table of Contents ntp ntp.timeSync(period, fnc, fun) ntp 模块功能&#xff1a;网络授时. 重要提醒&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 本功能模块采用多个免费公共的NTP服务器来同步时间 并不能保证任何时间任何地点都能百分…...

LangChain+ChatGLM大模型应用落地实践(一)

LLMs的落地框架&#xff08;LangChain&#xff09;&#xff0c;给LLMs套上一层盔甲&#xff0c;快速构建自己的新一代人工智能产品。 一、简介二、LangChain源码三、租用云服务器实例四、部署实例 一、简介 LangChain是一个近期非常活跃的开源代码库&#xff0c;目前也还在快速…...

PSO粒子群优化算法

PSO粒子群优化算法 算法思想matlab代码python代码 算法思想 粒子群算法&#xff08;Particle Swarm Optimization&#xff09; 优点: 1&#xff09;原理比较简单&#xff0c;实现容易&#xff0c;参数少。 缺点: 1&#xff09;易早熟收敛至局部最优、迭代后期收敛速度慢的…...

记一次 .NET某医疗器械清洗系统 卡死分析

一&#xff1a;背景 1. 讲故事 前段时间协助训练营里的一位朋友分析了一个程序卡死的问题&#xff0c;回过头来看这个案例比较经典&#xff0c;这篇稍微整理一下供后来者少踩坑吧。 二&#xff1a;WinDbg 分析 1. 为什么会卡死 因为是窗体程序&#xff0c;理所当然就是看主…...

C# 基于Rijndael对文件进行加解密

介绍&#xff1a; Rijndael 是一种对称加密算法&#xff0c;也是 AES&#xff08;Advanced Encryption Standard&#xff09;的前身。它用于数据的加密和解密&#xff0c;并提供了安全且高效的加密功能。 在.NET Framework 中&#xff0c;Rijndael 类是一个实现了 Rijndael 算法…...

Elasticsearchr入门

首先在官网下载elasticsearch8.9版本&#xff0c;以及8.9版本的kibana。 解压&#xff0c;点击es8.9bin目录下的elasticsearch.bat文件启动es 如图所示即为成功。 启动之后打开idea&#xff0c;添加依赖 <dependency><groupId>com.fasterxml.jackson.core</g…...

【ARM】imx6ul移植kernel记录,恩智浦github提供的最新kernel(2023年7月31)

❤️作者主页:凉开水白菜 ❤️作者简介:共同学习,互相监督,热于分享,多加讨论,一起进步! ❤️专栏目录: ❤️专栏资料: ❤️点赞 👍 收藏 ⭐再看,养成习惯 订阅的粉丝可通过PC端文末加我微信,可对文章的内容进行一对一答疑! 文章目录 一、简介二、源码下载三、官方…...

eeglab(自用)

目录 1.加载、显示数据 2.绘制脑电头皮图 3.绘制通道光谱图 4.预处理工具 5.ICA去除伪迹 5. 提取数据epoch 1.加载、显示数据 观察事件值(Event values)&#xff1a;该数据集中包含2400个事件&#xff0c;每个事件指定了EEG.event结构的字段Type(类型)、position(位置)和…...

编写同城公益捐书物资登记流转程序,统计闲置书籍物资,对接公益捐赠渠道。

一个完全去营销化、偏工程与社会创新视角的 Python 示例项目&#xff0c;定位为创新与创业实验课程原型&#xff0c;不绑定任何公益平台、不引导捐赠渠道、不涉及任何机构背书&#xff0c;仅作为物资登记与流转建模工具。 同城公益捐书物资登记流转程序 ——基于物资生命周期管…...

OriginPro 2023 相关性热图插件 CorrelationPlot 保姆级安装与配置指南(附资源下载)

OriginPro 2023 CorrelationPlot插件全流程配置指南&#xff1a;从零基础到高效科研可视化 科研数据处理中&#xff0c;相关性热图&#xff08;Correlation Plot&#xff09;是揭示变量间关联强度的利器。对于非编程背景的研究者而言&#xff0c;OriginPro的CorrelationPlot插件…...

别再为路径报错头疼了!手把手教你将Robei工程无缝迁移到Quartus II(附文件整理技巧)

从Robei到Quartus II&#xff1a;工程迁移的完整避坑指南 第一次把Robei工程导入Quartus II时&#xff0c;我盯着满屏的路径报错和未定义模块提示&#xff0c;差点把键盘摔了。这种挫败感想必每个FPGA初学者都经历过——明明在Robei里运行完美的设计&#xff0c;换到Quartus II…...

别再死记硬背了!用这个班级排名的例子,5分钟搞懂R语言dplyr包的四种join函数

班级运动会排名解析&#xff1a;用生活案例彻底掌握R语言dplyr连接函数 刚接触R语言的数据合并操作时&#xff0c;那些inner_join、left_join的术语总让人望而生畏。但数据连接的本质&#xff0c;其实就像学校运动会后整理各班成绩一样简单。想象你手上有两个班级的排名表和运动…...

如何用AI语音修复工具VoiceFixer拯救你的受损录音:终极指南

如何用AI语音修复工具VoiceFixer拯救你的受损录音&#xff1a;终极指南 【免费下载链接】voicefixer General Speech Restoration 项目地址: https://gitcode.com/gh_mirrors/vo/voicefixer 还在为那些珍贵的录音因为各种原因变得模糊不清而烦恼吗&#xff1f;VoiceFixe…...

华硕笔记本终极控制工具G-Helper:如何用轻量级软件替代臃肿的Armoury Crate

华硕笔记本终极控制工具G-Helper&#xff1a;如何用轻量级软件替代臃肿的Armoury Crate 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, V…...

高性能自动化网页信息提取工具实战指南:大规模目标扫描与安全检测技术方案

高性能自动化网页信息提取工具实战指南&#xff1a;大规模目标扫描与安全检测技术方案 【免费下载链接】URLFinder 一款快速、全面、易用的页面信息提取工具&#xff0c;可快速发现和提取页面中的JS、URL和敏感信息。 项目地址: https://gitcode.com/gh_mirrors/ur/URLFinder…...

Ansys Zemax实战:用Zernike相位面给离轴反射镜‘加料’,模拟加工误差就这么简单

Ansys Zemax高阶技巧&#xff1a;Zernike相位面在离轴反射镜公差分析中的工程实践 在光学系统设计领域&#xff0c;公差分析是确保量产可行性的关键环节。当设计从理想状态走向实际制造时&#xff0c;加工误差、装配偏差等因素都会对系统性能产生影响。对于离轴反射镜这类非对称…...

别只盯着流程了!聊聊Synopsys工具链里那些‘看不见’的库文件:LEF, LIB, TLUPlus到底在干嘛?

别只盯着流程了&#xff01;聊聊Synopsys工具链里那些‘看不见’的库文件&#xff1a;LEF, LIB, TLUPlus到底在干嘛&#xff1f; 在数字IC后端设计的浩瀚宇宙中&#xff0c;流程文档和工具操作指南往往像明亮的恒星吸引着初学者的目光&#xff0c;而那些支撑整个设计流程的底层…...

告别Mac NTFS读写限制:免费开源的终极解决方案

告别Mac NTFS读写限制&#xff1a;免费开源的终极解决方案 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and management for NTFS …...