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

分布式事务Seata实战-AT模式(注册中心为Eureka)

大致记录Seata的AT模式下创建项目过程中需要注意的点和可能遇到的问题。

本项目是以官网的给的示例(即下图)进行创建的,以Eureka为注册中心。

官网:Seata AT 模式 | Apache Seata™

官方代码示例: 

 快速启动 | Apache Seata™

此文章涉及的项目代码链接:seata-at: 分布式事务解决方案Seata 的AT模式

前期准备

1、下载seata-server (下载地址:https://seata.io/zh-cn/unversioned/download/seata-server ),本项目用的当前最新版seata-server-2.0.0.zip
2、JDK版本需要JDK8或者更高,本项目使用的JDK11
3、此项目SpringBoot的创建采用的阿里的初始化连接(https://start.aliyun.com/ ),修改方式可见附录
注:本项目采用eureka为注册中心;

项目搭建

数据库准备

根据官方示例建立三个数据库:storage、order、account;

账户库:seata_account

DROP TABLE IF EXISTS `account_tbl`;
CREATE TABLE `account_tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` varchar(255) DEFAULT NULL,
`money` int(11) DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- SEATA AT 模式需要 UNDO_LOG 表
DROP TABLE IF EXISTS `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=9 DEFAULT CHARSET=utf8;

订单库:seata_order

DROP TABLE IF EXISTS `order_tbl`;
CREATE TABLE `order_tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` varchar(255) DEFAULT NULL,
`commodity_code` varchar(255) DEFAULT NULL,
`count` int(11) DEFAULT 0,
`money` int(11) DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- SEATA AT 模式需要 UNDO_LOG 表
DROP TABLE IF EXISTS `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=9 DEFAULT CHARSET=utf8;

仓库库:seata_storage

DROP TABLE IF EXISTS `storage_tbl`;
CREATE TABLE `storage_tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`commodity_code` varchar(255) DEFAULT NULL,
`count` int(11) DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY (`commodity_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- SEATA AT 模式需要 UNDO_LOG 表
DROP TABLE IF EXISTS `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=9 DEFAULT CHARSET=utf8;

项目创建

创建项目 seata-at,依次创建子模块 account、order、 storage、business、eureka、common,项目结构如图:

需要修改seata-server的eureka注册配置(seata-server-2.0.0\conf\application.yml),如下:

seata:config:# support: nacos, consul, apollo, zk, etcd3type: fileregistry:type: eurekaeureka:service-url: http://localhost:8761/eurekaapplication: defaultweight: 1

项目中的 account、order、storage 模块中的resource/file.conf 文件中:修改 service 的内容由:

vgroup_mapping.business-service-seata-service-group = "default"

改为

vgroup_mapping.my_test_tx_group = "default"


项目中的 account、order、storage 模块中的resource/registry.conf文件 :修改registry的内容

type = "eureka"

application.properties 文件注意 seata.tx-service-group 无效,改用spring.cloud.alibaba.seata.tx-service-group,如下:

eureka.client.service-url.defaultZone=http://localhost:8761/eureka
spring.cloud.alibaba.seata.tx-service-group=my_test_tx_group
#使用无效 #seata.tx-service-group=my_test_tx_group
seata.service.disable-global-transaction=false

启动和测试

启动顺序:eureka 、seata-server(外部服务)、 account、storage、 order、 business

测试采用的Postman。

附录

Spring项目初始化链接修改

点击Server URL 的设置按钮,修改链接为:https://start.aliyun.com/ ,点击确认即可。

相关文章:

分布式事务Seata实战-AT模式(注册中心为Eureka)

大致记录Seata的AT模式下创建项目过程中需要注意的点和可能遇到的问题。 本项目是以官网的给的示例(即下图)进行创建的,以Eureka为注册中心。 官网:Seata AT 模式 | Apache Seata™ 官方代码示例: 快速启动 | Apac…...

windows vscode jsoncpp cmake c++ 构建项目

jsoncpp的编译和使用推荐文章:jsoncpp的编译和使用 | 爱编程的大丙 (subingwen.cn)https://www.subingwen.cn/cpp/jsoncpp/从这个链接下载jsoncpp-master:https://github.com/open-source-parsers/jsoncpp 可以把这个文件夹名字改成jsoncpp,…...

按照一定规则批量修改文件夹内文件的名称

#一个小朋友问我的问题,写好后,就想着分享出来# #目前只想到这一个普通的方法,应该还有更巧妙的方法,读者可以自己思考# 需求:给定文件夹40001,要求将该文件夹内的图片按照40001_00000001,40002_00000002…...

Git项目分支管理规范

一、分支管理 创建项目时,会针对不同环境创建两个常设分支(也可以算主分支,永久不会删除) master:生产环境的稳定分支,生产环境基于该分支构建。仅用来发布新版本,除了从release测试分支或 hotfix-*Bug修复分支进行m…...

ycsb压测mongodb

下载解压 https://github.com/brianfrankcooper/YCSB/releases/download/0.17.0/ycsb-mongodb-binding-0.17.0.tar.gz tar -zxvf ycsb-mongodb-binding-0.17.0.tar.gzycsb提前已经在workload文件夹下准备好了几个压测场景分别对应workload[a:f] workloads/workloada 样例 …...

【zip密码】Zip压缩包删除密码方法,有哪些?

大家都知道压缩包可以进行加密,但是当我们不需要加密压缩包的时候,该如何删除zip压缩包密码呢?那么zip压缩包密码取消都有什么方法呢?今天将方法总结分享给大家。 最原始的方法,就是通过解压文件,将解压出…...

代码随想录算法训练营day24 || 回溯法原理讲解,77.组合

回溯方法的理论原理与定义 回溯算法是潜藏于递归过程之中一种操作,与递归操作相辅相成;初步理解,有递归必有回溯,使用回溯最好的方式是递归,至于其他的方式有待探索。回溯是一种多重循环的变体,其本质就是…...

RPA与通知机器人的完美结合

写在前面 在现代快节奏的工作环境中,我们经常会面临多个任务同时进行的情况,你还在为时间不够用、忙碌而惆怅吗?你还在为时刻盯着电脑流程而烦恼吗?你还在为及时收不到自己的自动化任务进度而焦躁吗?别担心&#xff0…...

openssl3.2 - 官方demo学习 - signature - rsa_pss_direct.c

文章目录 openssl3.2 - 官方demo学习 - signature - rsa_pss_direct.c概述笔记END openssl3.2 - 官方demo学习 - signature - rsa_pss_direct.c 概述 用RSA私钥签名 d2i_PrivateKey_ex()可以从内存载入私钥数据, 得到私钥EVP_PKEY* 从私钥产生ctx, 对ctx进行签名初始化, 设置…...

高效批量剪辑技巧:一键按指定时长精准分割视频的方法,轻松制作视频

随着社交媒体和数字内容的快速发展,视频制作的需求也日益增长。在制作视频时,我们经常需要将长视频分割成多个片段,或者将多个片段连接在一起。为了提高效率,我们可以使用一些高效的批量剪辑技巧,一键按指定时长精准分…...

Android基础知识

1. Activity的生命周期 onCreate:Activity在启动时会被创建,后面一般不会在调用该方法(除非例外情况,将Activity回收,例如内存不足);onStart:Activity启动时,会调用该方…...

linux下把动态库变成静态库

1.用nm命令获取动态库中的所有符号列表,假如动态库的文件为lib.so nm -gD lib.so > lib.txt 将把符号列表输出到名为lib.txt的文本文件中 2.创建个新的静态库文件,使用ar命令可以创建一个空的静态库文件 ar -rcs lib.a 3.将动态库中的每个符号提…...

基于STM32单片机设计的智能水温控制系统

一、前言 1.1 项目介绍 【1】项目功能介绍 随着科技的快速发展和智能化生活的普及,人们对生活品质的需求日益提高,对家用电器自动化与智能化控制的要求也越来越高。在家庭用水场景中,热水器、浴缸以及智能水暖系统的温控需求尤为突出。传统水温控制系统往往功能单一、操作…...

PIL——图像读取、裁剪、保存操作

一、读取 Image.open(figure_path)二、裁剪 image.crop()image.crop() : 从图像中提取出某个矩形大小的图像。它接收一个四元素的元组作为参数,各元素为(x1, y1, x2, y2),即 左上角坐标、右下角坐标。坐标系统的原点&#xff08…...

Windows 下 QT开发环境的搭建:

下载QT:Index of /archive/qt/5.14 下载Cmake :CMake - Upgrade Your Software Build System (1)QT在windows,C, 打包exe: step1:window上安装QT软件: Windows下的QT系统开发环境搭建_qt windows-CSDN博客. step2:新建一个界面工程: (1)打…...

深度学习中Numpy的一些注意点(多维数组;数据类型转换、数组扁平化、np.where()、np.argmax()、图像拼接、生成同shape的图片)

文章目录 1多维数组压缩维度扩充维度 2numpy类型转换深度学习常见的float32类型。 3数组扁平化4np.where()的用法5np.argmax()6图像拼接7生成同shape的图片,指定数据类型 1多维数组 a.shape(3,2);既数组h3,w2 a.shape(2,3,2);这里第一个2表示axis0维度上…...

(2023版)斯坦福CS231n学习笔记:DL与CV教程 (56) | 卷积神经网络

前言 📚 笔记专栏:斯坦福CS231N:面向视觉识别的卷积神经网络(23)🔗 课程链接:https://www.bilibili.com/video/BV1xV411R7i5💻 CS231n: 深度学习计算机视觉(2017&#xf…...

表单验证 ---- 在Vue2中使用ElementUI进行表单验证

目录 前言 给表单绑定对应属性 在data中定义数据对象和表单的定义规则 与数据对象双向绑定 对整个表单进行验证 前言 在做项目时&#xff0c;对于表单进行验证是我们必不可少的 例如 搭建一个基本的登录界面 <div class"form"><h1>登录</h1>&…...

HarmonyOS 转场动画 ForEach控制

本文 我们继续说组件的专场特效 上文 HarmonyOS 转场动画 我们通过if控制了转场效果 本文 我们通过 ForEach 控制它的加载和删除 这时候就有人会好奇 ForEach 怎么控制删除呢&#xff1f; 很简单 循环次数不同 例如 第一次 10个 第二次 5个 那么后面的五个就相当于删除啦 我们…...

2024--Django平台开发-订单项目管理(十四)

day14 订单管理系统 1.关于登录 1.1 UI美化 页面美化&#xff0c;用BootStrap 自定义BooStrapForm类实现。 class BootStrapForm:exclude_filed_list []def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# {title:对象,"percent":对象}fo…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]

报错信息&#xff1a;libc.so.6: cannot open shared object file: No such file or directory&#xff1a; #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...