五分钟体验分布式事务框架Seata

article/2025/9/18 23:19:38

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。本教程旨在为读者提供一个快速入门seata的案例,详细使用请参考官方案例和文档。

seata-server搭建

在seata中,事务管理器是单独的一个服务,无需读者做二次开发,开箱即用。下载地址https://github.com/seata/seata/releases 。本文案例中使用2.1.0这个版本。下载完成并解压后,需要对seata-server进行配置,需要配置conf目录下的file.conf和registry.conf。

其中file.conf是配置seata-server的数据存储方式,支持本地文档和数据库,本文直接使用本地文件存储。配置如下:


## transaction log store, only used in seata-server
store {## store mode: file、dbmode = "file"## file store propertyfile {## store location dirdir = "sessionStore"# branch session size , if exceeded first try compress lockkey, still exceeded throws exceptionsmaxBranchSessionSize = 16384# globe session size , if exceeded throws exceptionsmaxGlobalSessionSize = 512# file buffer size , if exceeded allocate new bufferfileWriteBufferCacheSize = 16384# when recover batch read sizesessionReloadReadSize = 100# async, syncflushDiskMode = async}## database store propertydb {## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp) etc.datasource = "druid"## mysql/oracle/postgresql/h2/oceanbase etc.dbType = "mysql"driverClassName = "com.mysql.jdbc.Driver"url = "jdbc:mysql://127.0.0.1:3306/seata"user = "mysql"password = "mysql"minConn = 5maxConn = 30globalTable = "global_table"branchTable = "branch_table"lockTable = "lock_table"queryLimit = 100maxWait = 5000}
}

registry.conf是配置seata-server的注册中心的,本文案例注册到eureka上。

registry {# file 、nacos 、eureka、redis、zk、consul、etcd3、sofatype = "eureka"nacos {application = "seata-server"serverAddr = "localhost"namespace = ""cluster = "default"username = ""password = ""}eureka {serviceUrl = "http://localhost:8761/eureka"application = "default"weight = "1"}...}

业务代码初始化

去官网下载代码,也可以到本文整理出来的案例,下载地址:https://github.com/forezp/distributed-lab/tree/master/seata-sample

项目介绍

下载完成后,项目工程的文件目录如下,一共有5个工程,分别为eureka(注册中心)、business(交易发生的服务)、storage(库存服务)、order(订单服务)、account(账户服务),其中seata-server和另外四个业务服务都需要向eureka注册。sql目录为初始化sql的脚本。项目的目录结构如下。

seata-sample
├── account
├── bussiness
├── eureka
├── order
├── pom.xml
├── sql
└── storage

初始化sql

在数据库中创建seata的数据库,并导入在sql目录下的数据库脚本。

配置更改

在业务代码中引入seata的sdk后,需要配置file.conf和registry.conf,请查看源码中的代码。在application.properties中配置mysql的连接:

spring.cloud.alibaba.seata.tx-service-group=my_test_tx_group
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/seatatest?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456

启动工程

依次启动seata-server,euraka,business,storage,order,account工程。访问eureka的地址:http://localhost:8761/ ,可以见到服务都向eureka注册。

在启动business服务时,会向数据库插入以下的数据:

 @PostConstructpublic void initData() {jdbcTemplate.update("delete from account_tbl");jdbcTemplate.update("delete from order_tbl");jdbcTemplate.update("delete from storage_tbl");jdbcTemplate.update("insert into account_tbl(user_id,money) values('U100000','10000') ");jdbcTemplate.update("insert into storage_tbl(commodity_code,count) values('C100000','200') ");}

测试

seata官方已经将代码逻辑写好了,直接测试即可。

curl http://127.0.0.1:8084/purchase/commit

此接口代码逻辑如下:

@RequestMapping(value = "/purchase/commit", produces = "application/json")public String purchaseCommit() {try {businessService.purchase("U100000", "C100000", 30);} catch (Exception exx) {return exx.getMessage();}return "全局事务提交";}

即买30个库存,当前库存、金额都够,所以交易正常进行。

完成后可以看到数据库中 account_tblid为1的money会减少 5,order_tbl中会新增一条记录,storage_tblid为1的count字段减少 1

2020-05-21 16:09:12.388 INFO [AsyncCommitting_1]io.seata.server.coordinator.DefaultCore.doGlobalCommit:240 -Committing global transaction is successfully done, xid = 10.66.40.141:8091:2012236512.

发生异常事务回滚

调用如下的接口:

curl http://127.0.0.1:8084/purchase/rollback

此接口代码逻辑如下:

@RequestMapping("/purchase/rollback")public String purchaseRollback() {try {businessService.purchase("U100000", "C100000", 99999);} catch (Exception exx) {return exx.getMessage();}return "全局事务提交";}

次接口先扣掉了库存,然后扣掉了钱,最后查询数据库,发现数据库的库存为负数,于是抛出异常,发生回滚,待完成后数据库中的数据没有发生变化,回滚成功。可见分布式事务回滚操作成功。

参考资料

http://seata.io/zh-cn/docs/overview/what-is-seata.html


http://chatgpt.dhexx.cn/article/63e2Ijkf.shtml

相关文章

SpringBoot非官方教程 | 第二十五篇:2小时学会springboot

转载请标明出处: https://www.fangzhipeng.com/springboot/2017/05/25/sb25-2hour.html 本文出自方志朋的博客 一.什么是spring boot Takes an opinionated view of building production-ready Spring applications. Spring Boot favors convention over configurat…

Spring Cloud Alibaba教程:使用Nacos作为配置中心

转载请标明出处: https://blog.csdn.net/forezp/article/details/90729945 本文出自方志朋的博客 个人博客纯净版https://www.fangzhipeng.com/springcloud/2019/06/01/sc-nacos-config.html 在上一篇文章中讲解了如何使用Nacos作为服务注册中心注册。Nacos除了可以…

20 个实例玩转 Java 8 Stream

点击关注公众号,Java干货及时送达 先贴上几个案例,水平高超的同学可以挑战一下: 1. 从员工集合中筛选出salary大于8000的员工,并放置到新的集合里。 2. 统计员工的最高薪资、平均薪资、薪资之和。 3. 将员工按薪资从高到低排序&am…

2019新鲜出炉的BAT通关面试题 Java岗

点击上方“方志朋”,选择“置顶或者星标” 你的关注意义重大! 来源于公号:孤独烟 由于近期是互联网寒冬,然而烟哥的好友还是顶着重重压力出去面试,最终斩获无数offer。 在烟哥的沟通下,终于套得其中一套题…

史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)

转载请标明出处: https://www.fangzhipeng.com/springcloud/2017/06/02/sc02-rest-ribbon.html 本文出自方志朋的博客 个人博客纯净版:https://www.fangzhipeng.com/springcloud/2017/06/02/sc02-rest-ribbon.html 最新Finchley版本: https:…

史上最简单的 SpringCloud 教程 | 终章

转载请标明出处: http://blog.csdn.net/forezp/article/details/70148833 本文出自方志朋的博客 扫码关注有惊喜 (转载本站文章请注明作者和出处 方志朋的博客) 个人博客纯净版https://www.fangzhipeng.com/spring-cloud.html 错过了这一篇…

SpringCloud-Finchley集成Zuul服务网关组件并实现回退

1.服务网关Zuul介绍 服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制等功能。Spring Cloud Netflix中的Zuul就担任了这样的一个角色,为微…

数控机床设备物联网远程控制解决方案

数控机床设备应用物联网技术方案实现远程监控管理背景 数控机床设备利用先进的计算机和网络技术进行设备物联网。利用计算机硬件、软件、网络设备通信设备以及其他办公设备,进行信息的收集、传输、加工、储存、更新和维护,以战略竟优、提高效率为目的,支持高层决策、中层管理…

远程控制树莓派

一、局域网 1. 让树莓派连上手机热点或wifi 将空白的ssh文件放入树莓派SD卡的boot盘 手动创建一个空白记事本.txt文件,命名为ssh,重命名,删掉.txt扩展名。将这个文件放入SD卡的boot盘中。 配置wifi文件,放入SD卡的boot盘 用同样…

推荐一款国产远程控制软件ToDesk,轻量级,不限速,开启云办公新模式

一、远程办公新时代 前段时间,我们公司使用的向日葵远程控制竟然崩了,导致无法登录,当时以为是公司网络出问题了,结果并妹有。后来就看到官方回应说,因为大量用户涌入导致服务器宕机了! 不管你们信不信&a…

远程控制电脑

任意网络环境下的设备远程控制任意网络环境下的设备 对于远程操控电脑已经不是什么难的事情了,但是对于有的操作方法其实还是有难度的,今天我就介绍一下如何远程控制电脑。 1、远程控制的好处 远程控制的好处那就多了,不管你是学生还是…

企业如何实现IoT物联网远程控制

在IoT物联网革命中,一切都正在变得智能化,因此也可以称其为连接设备的革命。如今,物联网采用信息化技术手段,促进了人类生活和生产服务的全面升级,从智能家居硬件、智能穿戴、智能交通、智能医疗、智能车载、嵌入式开发…

服务器如何开启远程控制,远程控制命令设置方法介绍

大家在长时间的使用电脑以后,电脑就会出现一些毛病,这个时候人们都会给电脑维修工打电话亲上 门 儿服务,而大家都知道上门儿服务费用是非常的高的。但是远程控制出现就解决了这个问题,大家可以通过网络工程师对自己电脑进行远程控制,从而实现修理电脑的目的。但是有非常多…

快速实现远程控制Android手机

直接在web端或者手机端远程控制其他手机,想想都刺激,于是在google上一阵狂搜,发现很多方案都要root手机,直接pass,还有的方案需要写大量看不懂的代码,pass。最近一直在研究的冰狐智能辅助平台出了一个远程控…

内网远程控制安卓设备软件推荐

有些企业需要在内网环境远程控制安卓设备,实现批量维护安卓设备等需求。有什么软件或者解决方案,可以实现内网远程控制安卓设备呢? 这个问题要分两个情况解决,看你能不能走外网。如果IT和安卓设备属于同一个局域网,但…

向日葵远程控制的使用方法

1. 首先在办公电脑上下载安装向日葵远程控制端,注册账号,记录保存“允许控制本机”的“本机识别码”和“本机验证码”,并设置“开机自动启动”,保持向日葵的开启状态; 2. 在家用电脑上下载安装向日葵远程控制端&#…

远程控制工具哪个好?向日葵VS ToDesk,安卓移动设备远程操控哪个更好用?

现如今,科技的发展,使得手机的功能也越来越智能化,可有些小伙伴对智能化手机有许多不会操作的地方,这时,就可以利用远程手机软件,来请求别人的远程帮助。或者,当我们的手机丢失了,也…

计算机远程控制阀门开启,阀门远程控制系统

原标题: 阀门远程控制系统 一、系统概述 阀门远程监控系统以无线方式通过云服务中心发出指令来控制放置远端的(如野外、地下管网等)电动阀们设备,从而实现电动阀门的开关,并将阀门的开关状态、工作状态、设备是否在线、历史数据查询等信息反馈…

如何免ROOT,实现安卓设备远程控制?

关于远控移动设备,小编经常收到一些疑问,最常见的就是远控安卓必须root吗? 那必须不是啊!无需root,远控安卓一样有的是办法! 今天小编就带大家来看一下如何轻松解决免root,远控安卓手机的办法…

android远程管理Windows,使用Android、IOS设备远程控制Windows系统

大家都知道,Windows支持远程控制功能,可在同一局域网内连接控制电脑,借助RD网关还可以在互联网里自由连接控制其它内网中的某台电脑。微软其实针对Android、IOS、Mac等系统都推出了RD客户端软件。 (IOS、Mac版在App Store中搜索下载) 1. 首先…