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

apache-seata-2.1.0 AT模式使用篇(配置简单)

最近在研究seata的AT模式,先在本地搭建了一个演示demo,看看seata是如何使用的。在网上搜的demo,配置相对来说都比较多。我最终搭建的版本,配置较少,所以写篇文章分享下,希望能帮到对seata感兴趣的小伙伴。先看下文章目录

文章目录

  • 1、AT模式架构图
  • 2、演示微服务搭建
    • 2.1、demo源码获取
    • 2.2、项目配置改动
      • 2.2.1、执行scripts中的脚本
      • 2.2.2、修改数据库的连接
      • 2.2.3、修改注册中心
  • 3、seata server服务搭建
  • 4、验证
    • 4.1、事务成功提交
    • 4.2、事务回滚

1、AT模式架构图

我从官网上拷贝了一张图,先看一下seata AT模式的整体架构
在这里插入图片描述
从图上,一共看到5个服务
1)、TC:事务协调者,负责全局事务的管理,以及各分支事务的管理

2)、Business:业务聚合服务,比如下单服务。在下单服务中,会依赖很多上游服务,比如图中的库存服务、订单服务、账户服务等

3)、Storage:库存服务

4)、Account:账户服务

5)、Order:订单服务

2、演示微服务搭建

2.1、demo源码获取

我把演示demo的代码上传到了码云,可以从码云上将项目下载下来,在本地部署
项目地址
依次启动OrderService、StorageService、AccountService、seataProject这4个项目

2.2、项目配置改动

2.2.1、执行scripts中的脚本

以AccountService项目举例,其他3个项目一样
account_tbl.sql
undo_log.sql
在这里插入图片描述

2.2.2、修改数据库的连接

如果你的这几个项目对应的数据库端口和我项目里不一致,需要改下
在这里插入图片描述

2.2.3、修改注册中心

如果你不想用zookeeper,那这里也需要修改一下
在这里插入图片描述

3、seata server服务搭建

其实没啥可搭建的,开箱即用。seata server下载地址
启动命令如下。如果想改端口运行,可以加-p参数或者修改conf目录中的application.yml文件

sh seata-server.sh -h 127.0.0.1 -m file

4、验证

如果你没改动端口,直接访问
http://127.0.0.1:6099/business/commit?userId=2&commodityCode=1&orderCount=2,即可触发下单异常,我在OrderService的微服务中写死了一段测试代码,userId=2时,触发一个异常,然后触发事务回滚
此时可以在TM、RM处看到事务提交以及回滚的日志

4.1、事务成功提交

TM提交事务日志

//1、开启一个全局事务,事务id: 0.0.1.1:8099:6224557381237174277
o.a.s.tm.api.DefaultGlobalTransaction    : Begin new global transaction [0.0.1.1:8099:6224557381237174277]//2、准备提交事务
o.a.s.tm.api.DefaultGlobalTransaction    : transaction 0.0.1.1:8099:6224557381237174277 will be commit//3、事务提交结束
o.a.s.tm.api.DefaultGlobalTransaction    : transaction end, xid = 0.0.1.1:8099:6224557381237174277//4、事务已提交
o.a.s.tm.api.DefaultGlobalTransaction    : [0.0.1.1:8099:6224557381237174277] commit status: Committed

RM提交事务日志

//1、注册分支事务成功,分支事务id:6224557381237174279; 全局事务id: 0.0.1.1:8099:6224557381237174277
o.a.seata.rm.AbstractResourceManager     : branch register success, xid:0.0.1.1:8099:6224557381237174277, branchId:6224557381237174279, lockKeys:account_tbl:1//2、提交分支事务
o.a.s.c.r.p.c.RmBranchCommitProcessor    : rm client handle branch commit process:BranchCommitRequest{xid='0.0.1.1:8099:6224557381237174277', branchId=6224557381237174279, branchType=AT, resourceId='jdbc:mysql://127.0.0.1:3310/seata-account', applicationData='null'}//3、分支事务提交中
org.apache.seata.rm.AbstractRMHandler    : Branch committing: 0.0.1.1:8099:6224557381237174277 6224557381237174279 jdbc:mysql://127.0.0.1:3310/seata-account null//4、分支事务提交成功
org.apache.seata.rm.AbstractRMHandler    : Branch commit result: PhaseTwo_Committed

然后可以看下三张表(库存、订单、账户)的数据是否保持一致

4.2、事务回滚

手动制造一个提交异常,然后看TM以及AM的日志

TM回滚事务日志

//1、开启一个全局事务,事务id: 0.0.1.1:8099:6224557381237174273
o.a.s.tm.api.DefaultGlobalTransaction    : Begin new global transaction [0.0.1.1:8099:6224557381237174273]//2、事务将要回滚
o.a.s.tm.api.DefaultGlobalTransaction    : transaction 0.0.1.1:8099:6224557381237174273 will be rollback//3、事务回滚结束
o.a.s.tm.api.DefaultGlobalTransaction    : transaction end, xid = 0.0.1.1:8099:6224557381237174273//4、事务已回滚
o.a.s.tm.api.DefaultGlobalTransaction    : [0.0.1.1:8099:6224557381237174273] rollback status: Rollbacked

RM回滚事务日志

//1、注册分支事务,分支事务id:6224557381237174275; 全局事务id: 0.0.1.1:8099:6224557381237174273
o.a.seata.rm.AbstractResourceManager     : branch register success, xid:0.0.1.1:8099:6224557381237174273, branchId:6224557381237174275, lockKeys:account_tbl:2//2、分支事务回滚,回滚要依赖undo_log日志
o.a.s.c.r.p.c.RmBranchRollbackProcessor  : rm handle branch rollback process:BranchRollbackRequest{xid='0.0.1.1:8099:6224557381237174273', branchId=6224557381237174275, branchType=AT, resourceId='jdbc:mysql://127.0.0.1:3310/seata-account', applicationData='null'}//3、分支事务回滚中
org.apache.seata.rm.AbstractRMHandler    : Branch Rollbacking: 0.0.1.1:8099:6224557381237174273 6224557381237174275 jdbc:mysql://127.0.0.1:3310/seata-account//4、回滚完成,删除undo_log
o.a.s.r.d.undo.AbstractUndoLogManager    : xid 0.0.1.1:8099:6224557381237174273 branch 6224557381237174275, undo_log deleted with GlobalFinished//5、分支事务回滚成功
o.a.s.rm.datasource.DataSourceManager    : branch rollback success, xid:0.0.1.1:8099:6224557381237174273, branchId:6224557381237174275//6、分支事务回滚结果.二阶段回滚
org.apache.seata.rm.AbstractRMHandler    : Branch Rollbacked result: PhaseTwo_Rollbacked

再次看下三张表的数据,如果事务回滚成功,数据是没有变化的,不会发生修改或者新增
最后看下undo_log表,应该是无数据,但是Auto_Increment的值已经变成了2,证明undo_log中新增过一条数据,然后又被删除了。这印证了,事务回滚会利用到undo_log,回滚完成,就删除undo_log

相关文章:

apache-seata-2.1.0 AT模式使用篇(配置简单)

最近在研究seata的AT模式,先在本地搭建了一个演示demo,看看seata是如何使用的。在网上搜的demo,配置相对来说都比较多。我最终搭建的版本,配置较少,所以写篇文章分享下,希望能帮到对seata感兴趣的小伙伴。先…...

(金蝶云星空)客户端追踪SQL

快捷键 ShitfCtryAltM 点击开始、最后操作功能、然后查看报告 SQL报告...

OAK相机:纯视觉SLAM在夜晚的应用

哈喽,OAK的朋友们,大家好啊,今天这个视频主要想分享一下袁博士团队用我们的OAK相机产出的新成果 在去年过山车SLAM的演示中,袁博士团队就展示了纯视觉SLAM在完全黑暗的环境中的极高鲁棒性。 现在袁博士团队进一步挖掘了纯视觉的潜…...

发送方确认

在使用RabbitMQ的时候,可以通过消息持久化来解决因为服务器的异常而导致的消息就是,但是还有一个问题,当消息的生产者将消息发送出去之后,消息到底有没有正确地到达服务器呢?如果消息在到达服务器之前已经丢失&#xf…...

如何使用HighBuilder前端开发神器

一,前言 前端开发是网页和应用程序设计与开发中的一个重要分支,直接涉及用户界面的构建和用户与网页的交互。前端是用户在浏览器中看到的部分,负责为用户提供良好的体验。 二,前段介绍 1. 前端的组成 前端开发主要由三个核心技…...

发现了NitroShare的一个bug

NitroShare 是一个跨平台的局域网开源网络文件传输应用程序,它利用广播发现机制在本地网络中找到其他安装了 NitroShare 的设备,从而实现这些设备之间的文件和文件夹发送。 NitroShare 支持 Windows、macOS 和 Linux 操作系统。 NitroShare允许我们为…...

如何关闭 Ubuntu22.04 LTS 的更新提醒

引言 众所周知,Ubuntu 的软件更新和版本更新提醒是又多又烦,如果不小心更新到了最新的 Ubuntu 还可能面临各种各样的问题,这里提供一个解决方法 步骤 首先按照下面步骤打开 Software & Updates 然后按照下面步骤依次点击 最后关闭即可…...

美术资源规范

很多项目都没有重视资源规范,而是不断追求更高的运行效率。然而资源规范在项目中是非常重要的,资源规范才是高效运行的前提。 在有的项目中,一个人物模型几万个面、一个建筑模型就几十万个面,贴图也不规范,1024、2048…...

UE5.4 PCG 获取地形Layer

使用AttributeFilter:属性过滤器 节点 设置地形Layer名称和权重 效果:...

用 cURL 控制 OpenSIPS3.4

opensips-cli -x mi reload_routes,重读脚本路由opensips-cli -x mi ds_list,就是 dispatcher list 的缩写,简单明了opensips-cli -x mi ds_reload,修改 OpenSIPS 数据库的 dispatcher 表之后,用此命令读到内存opensip…...

【LuatOS】基于WebSocket的同步请求框架

0x00 缘起 由于使用LuatOS PC模拟器发起快速且海量HTTP请求(1000 次/秒)时,会耗尽PC的TCP连接资源,而无法进行继续进行访问请求。故使用WebSocket搭建类似于HTTP的“同步请求相应”的通信框架,以实现与HTTP类似的功能…...

架构师考试系列(8)论文专题:信息系统安全设计

摘要 2021年4月,我公司承接了一款健康养老系统项目,旨在提供以健康养老为核心的管理平台。本文探讨了如何在系统开发中贯彻安全优先原则,保障系统的安全性和保密性。系统包括健康档案、照护计划、服务审计、健康状况跟踪、费用管理等功能模块。我作为系统架构设计师,负责了…...

浙大一附院就医:分享给大家工作久了关节疼的就医经验,腱鞘炎

症状描述:日常生活不影响,但左手手腕往前或者往后扭曲力度过大时会有痛感。 医嘱详情:腱鞘炎,可能是工作键盘打字久了导致,开了三盒药贴,一盒三片,一共9片,另外再买一个比较硬的护腕…...

如何降低 PCIe RTT?

以下是一些降低 PCIe RTT(往返时间)的方法: 硬件方面4: 优化主板设计与布局: 合理分配 PCIe 通道:确保不同的 PCIe 设备被分配到独立的、互不干扰的 PCIe 通道上。例如,如果主板上有多个 PCIe 插…...

数据结构之二叉树--前序,中序,后序详解(含源码)

二叉树 二叉树不能轻易用断言,因为树一定有空 二叉树链式结构的实现 在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。 typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType _data;struct B…...

红黑树及MySQL 基础架构

红黑树简介及左旋、右旋、变色 红黑树(Red Black Tree)是一种自平衡二叉搜索树(二叉查找树),是一种特殊的二叉搜索树,在进行插入和删除时通过特定操作保持二叉树自身的平衡,从而获得较高的查找性能。 红黑树的平衡操作通过左旋、右旋和变色来…...

大数据-212 数据挖掘 机器学习理论 - 无监督学习算法 KMeans 基本原理 簇内误差平方和

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...

QJson-趟过的各种坑(先坑后用法)

QJson-趟过的各种坑【先坑后用法】 Chapter1 QJson-趟过的各种坑【先坑后用法】一、不能处理大数据量,如果你的数据量有百兆左右(特别是有的小伙伴还喜欢json格式化输出的),不要用Qjson,否则会报错 DocumentTooLarge二、json格式化输出1.构建…...

基于STM32的hx711称重模块使用

欢迎入群共同学习交流 时间记录:2024/11/9 一、知识点记录 1、hx711 1)HX711是一款高精度压力传感器专用的24位模数转换芯片,主要功能是将测得的微小电压信号放大到可以被微控制器读取的范围 2)工作电压2.6-5.5V 3)引…...

Nginx独立项目相关配置说明

配置前说明 1. 部署环境为https环境的,除华为云表态托管等都需要此配置,如cloud。 2. 部署环境为https环境的,可以使用api.js直接访问后端服务,无需此配置。 3. 转发的后台服务接口需要和后台人员沟通确认一致。详细配置说明 **…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...

SpringTask-03.入门案例

一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...