五分钟体验分布式事务框架Seata
点击上方“方志朋”,选择“设为星标”
回复”666“获取新整理的面试文章
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_tbl
的id
为1的money
会减少 5,order_tbl
中会新增一条记录,storage_tbl
的id
为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
热门内容:骚操作 | 不重启 JVM,替换掉已经加载的类,偷天换日?分布式锁用 Redis 还是 Zookeeper?写那么多年Java,还不知道啥是Java agent 的必须看一下!
科普|什么是负载均衡(Load balancing)最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡
五分钟体验分布式事务框架Seata相关推荐
- druid seata 配置_五分钟体验分布式事务框架Seata
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata 将为用户提供了 AT.TCC.SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案.本教程 ...
- 五分钟体验分布式调度框架xxl-job
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速. ...
- 分布式事务——分布式事务简介、分布式事务框架 Seata(AT模式、Tcc模式、Tcc Vs AT)、分布式事务—MQ
分布式事务--分布式事务简介.分布式事务框架 Seata(AT模式.Tcc模式.Tcc Vs AT).分布式事务--MQ 一.分布式事务简介 如果不是分布式环境的话一般不会接触到这种,一旦是微服务这种 ...
- 分布式事务框架seata介绍
分布式事务框架seata介绍 一 . 事务特性(ACID) 1.原子性(A) 在整个事务中的所有操作,要么全部完成,要么全部不做,没有中间状态.对于事务在执行中发生错误,所有的操作都会被回滚,整个事务 ...
- 分布式事务框架Seata
分布式事务框架Seata sei达 一. 分布式事务前言 1. 数据库管理系统中事务(transaction)的四个特性:简称ACID(这种特性简称刚性事物) 原子性(Atomicity):原 ...
- 阿里分布式事务框架Seata原理解析
阿里分布式事务框架Seata原理解析 作者:伊凡的一天 链接:https://www.jianshu.com/p/044e95223a17 Seata框架是一个业务层的XA(两阶段提交)解决方案.在理 ...
- 阿里开源一站式分布式事务框架seata源码分析(AT模式下TM与RM分析)
序言: 对于阿里开源分布式事务框架seata的详细了解可以参考官网,这里不会详细介绍.本章只会介绍seata中AT模式的源码分析(对阿seata有一定了解或者成功完成过demo). seata中一个事 ...
- 老板现在喊我大哥,原因是我用阿里分布式事务框架Seata解决了长久以来困扰公司的分布式事务问题
大家好,我是曹尼玛 从大学毕业5年,一直努力学习,努力工作,追求新技术,不保守. 上个月我来到一家新公司上班,月薪20K,这家公司老板人很好,对员工很关爱,公司氛围不错,同事们也努力把公司项目搞搞好. ...
- 阿里分布式事务框架Seata集成详情
大家好,我是曹尼玛 从大学毕业5年,一直努力学习,努力工作,追求新技术,不保守. 上个月我来到一家新公司上班,月薪20K,这家公司老板人很好,对员工很关爱,公司氛围不错,同事们也努力把公司项目搞搞好. ...
最新文章
- Java多线程并发常用类实例之:exchanger
- json map java_Java:JSON和Map相互转换
- 利用XML实现通用WEB报表打印 卢彦
- 数据结构与算法--数组中的逆序对
- 我的梦幻动画实习工作总结
- pb如何获取数据窗口选中行_pb从数据窗口获得数据的方法总结
- java像sql一样处理数据_像Excel一样使用SQL进行数据分析
- 3DMAX安装失败怎样卸载重新安装3DMAX,解决3DMAX安装失败的方法总结
- 剑指 Offer 64. 求1+2+…+n(面试题中的短路与)
- 清除eclipse当前登录的SVN账户
- 情侣c语言程序,C/C++编程笔记:C语言制作情侣必备《爱情电子相册》,源码解析!...
- 串口调试助手fx2n_串口调试助手发送控制台达PLC命令
- Oracle LiveLabs实验:DB Security - Unified Auditing
- 支持 Docker 运行的 ChatGPT 平替之 Alpaca-Turbo (羊驼)
- (2022)Springboot+vue3项目开发前后端分离书法图书管理Coun
- 11.4 使用Markdown和Flask-PageDown:没有文本编辑框的问题
- mysql8实战_实战MySQL8.0.17 Clone Plugin
- 《浮世绘---湖北人,你到底患了什么病》(转载)
- Magnifier.js - 支持鼠标滚轮缩放的图片放大镜效果
- 判断字符串中的字母大小写、数字