0. 介绍

2019 年 1 月,阿里巴巴中间件团队发起了开源项目 Fescar(Fast & EaSy Commit And Rollback),和社区一起共建开源分布式事务解决方案。Fescar 的愿景是让分布式事务的使用像本地事务的使用一样,简单和高效,并逐步解决开发者们遇到的分布式事务方面的所有难题。
Fescar 开源后,蚂蚁金服加入 Fescar 社区参与共建,并在 Fescar 0.4.0 版本中贡献了 TCC 模式。
为了打造更中立、更开放、生态更加丰富的分布式事务开源社区,经过社区核心成员的投票,大家决定对 Fescar 进行品牌升级,并更名为 Seata,意为:Simple Extensible Autonomous Transaction Architecture,是一套一站式分布式事务解决方案。
Seata 融合了阿里巴巴和蚂蚁金服在分布式事务技术上的积累,并沉淀了新零售、云计算和新金融等场景下丰富的实践经验,但要实现适用于所有的分布式事务场景的愿景,仍有很长的路要走。因此,我们决定建立一个完全中立的分布式事务组织,希望更多的企业、开发者能够加入我们,一起打造 Seata。

1. 依赖工具

Maven
Git
JDK
注意,IntelliJ IDEA 最好使用最新版本。目前使用的是 2019.1.2 ,避免出现奇怪的问题。= =~反正我是出了,所以做了升级。
MySQL
Nacos

2. 源码拉取

本小节,我们需要拉取两个项目的源码:

2.1 获取 Demo 源码

使用 IntelliJ IDEA 从 https://github.com/seata/seata-samples 拉取代码。拉取完成后,Maven 会下载依赖包,可能会花费一些时间,耐心等待下。

2.2 获取 Seata 源码

从官方仓库 https://github.com/seata/seata Fork 出属于自己的仓库。为什么要 Fork ?既然开始阅读、调试源码,我们可能会写一些注释,有了自己的仓库,可以进行自由的提交。。
如果 Fork 了 Seata 项目,注意替换成自己的仓库地址。
这么做是,方便后面 IDEA 调试 Seata 源码时,使用我们克隆的项目的源码。
3、修改 Demo 项目引用 Seata 的版本号,为克隆的 Seata 项目的版本号(例如本文为 0.6.0-SNAPSHOT)。如下图所示:

3. 启动 Seata Server 服务

比较简单,搜到 io.seata.server.Server 类,直接迅猛右键 main 方法,运行,启动完毕。可看到如下日志:

4. 启动 Demo 项目

Seata 提供了各种 Demo ,选择了 spring-boot-dubbo-seata 项目,基于 Spring Boot + Dubbo 的示例。

4.1 初始化数据库

目前 Seata 暂时只支持 MySQL 
1、创建数据库,名字为 db_gts_fescar 。
2、将 spring-boot-dubbo-seata/sql/db_seata.sql 导入到数据库中,进行表的初始化。
使用单库怎么测试分布式事务呢?即使单库,如果多个服务进行事务操作,一样会形成分布式事务。

4.2 启动 Nacos 服务

1、打开 https://github.com/alibaba/nacos/releases 网页,下载 Nacos 。目前看到的最新版本是 1.0.0 ,所以当然下载它。
2、创建数据库,名字为 nacos_devtest 。然后,将 Nacos 所在目录/conf/nacos-mysql.sql 导入数据库中。
3、编辑 Nacos 所在目录/conf/application.properties 配置文件,增加 Nacos 数据库连接。例如如下:
spring.datasource.platform=mysql
 
 
 
db.num=1
 
 
db.user=root
 
db.password=你的密码
 
 
4、执行 nohup sh bin/startup.sh -m standalone & 命令,启动 Nacos 服务。
5、浏览器打开 http://127.0.0.1:8848/nacos 网页,输入 nacos / nacos 进行登录。

4.3 启动各种项目

4.3.1 启动 samples-storage 项目

搜到 io.seata.samples.integration.storage.StorageGtsFescarExampleApplication 类,直接迅猛右键 main 方法,运行,启动完毕。可看到如下日志:
INFO 29748 --- [imeoutChecker_1] i.s.core.rpc.netty.NettyPoolableFactory  : NettyPool create channel to transactionRole:TMROLE,address:127.0.0.1:8091,msg:< RegisterTMRequest{applicationId='storage-gts-fescar-example', transactionServiceGroup='my_test_tx_group'} >
 
INFO 29748 --- [imeoutChecker_1] io.seata.core.rpc.netty.RmRpcClient      : will connect to 127.0.0.1:8091
 
INFO 29748 --- [imeoutChecker_1] io.seata.core.rpc.netty.RmRpcClient      : RM will register :jdbc:mysql://180.167.213.26:13306/db_gts_fescar?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
 
INFO 29748 --- [imeoutChecker_1] i.s.core.rpc.netty.NettyPoolableFactory  : NettyPool create channel to transactionRole:RMROLE,address:127.0.0.1:8091,msg:< RegisterRMRequest{resourceIds='jdbc:mysql://180.167.213.26:13306/db_gts_fescar?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true', applicationId='storage-gts-fescar-example', transactionServiceGroup='my_test_tx_group'} >
 
INFO 29748 --- [imeoutChecker_1] io.seata.core.rpc.netty.RmRpcClient      : register RM success. server version:0.6.0,channel:[id: 0x56592a3a, L:/127.0.0.1:62656 - R:/127.0.0.1:8091]
 
INFO 29748 --- [imeoutChecker_1] i.s.core.rpc.netty.NettyPoolableFactory  : register success, cost 32 ms, version:0.6.0,role:TMROLE,channel:[id: 0xca65c481, L:/127.0.0.1:62657 - R:/127.0.0.1:8091]
 
INFO 29748 --- [imeoutChecker_1] i.s.core.rpc.netty.NettyPoolableFactory  : register success, cost 41 ms, version:0.6.0,role:RMROLE,channel:[id: 0x56592a3a, L:/127.0.0.1:62656 - R:/127.0.0.1:8091]
 
已经成功注册到 Seata Server 服务 中。

4.3.2 启动 samples-account 项目

搜到 io.seata.samples.integration.account.AccountGtsFescarExampleApplication 类,直接迅猛右键 main 方法,运行,启动完毕。
效果同 samples-storage 项目。

4.3.3 启动 samples-order 项目

搜到 io.seata.samples.integration.order.OrderGtsFescarExampleApplication 类,直接迅猛右键 main 方法,运行,启动完毕。
效果同 samples-storage 项目。

4.3.4 启动 samples-dubbo-business-call 项目

搜到 io.seata.samples.integration.call.DubboGtsFescarExampleApplication 类,直接迅猛右键 main 方法,运行,启动完毕。
至此,我们已经把需要启动的项目,都启动完毕。此时,我们打开 Nacos 可以看到各个服务的状况。如下图:

4.4 测试分布式事务

下面,我们将测试两种情况:
分布式事务正常提交
分布式事务异常回滚

4.4.1 正常流程

在 Postman 中,模拟请求如下图:
请求地址:127.0.0.1:8104//business/dubbo/buy
请求数据:
{
 
     "userId": "1",
 
"commodityCode": "C201901140001",
 
      "name": "水杯",
 
  "count": 1,
 
     "amount": 0.01
 
}
 
 
请求成功后,我们看看数据的变化。如下图:
t_order 表,新增了一条记录。如下图:
t_storage 表,库存减一。如下图:
t_account 表,余额减一。如下图:

4.4.2 异常流程

在 Postman 中,模拟请求如下图:
我们故意将商品编号 "commodityCode" 写错成了 "C201901140001xxxx" ,用于模拟分布式事务,因为库存不足,进行回滚。
为了更好的看过过程中的变化,我们在 BusinessServiceImpl 类的 #handleBusiness(BusinessDTO businessDTO)方法,第 XX 行,打了一个断点。如下图所示:
做好了这些准备,我们点击 Postman ,执行请求。因为我们在 BusinessServiceImpl 打了断点,所以我们看看执行到此处,数据的变化。如下图:
t_order 表,新增了一条记录。如下图:
t_storage 表,库存不变,因为我们使用了一个不存在的商品。如下图:
t_account 表,余额减一。如下图:
此时,我们放开断点,执行下去,因为扣库存失败,所以会抛出 DefaultException 异常,从而回滚全局事务。然后呢,数据又恢复:
t_order 表,如下图:
t_storage 表,如下图:
t_account 表,如下图:

seata demo的更多相关文章

  1. 分享一个seata demo,讲两个个问题

    Seata,阿里开源的分布式事务框架,多的我就不介绍了,了解详细介绍,请看官网.seata spring boot入门,可以看我上一篇博客<Spring boot微服务如何集成fescar解决分 ...

  2. spring boot:使用分布式事务seata(druid 1.1.23 / seata 1.3.0 / mybatis / spring boot 2.3.2)

    一,什么是seata? Seata:Simpe Extensible Autonomous Transcaction Architecture, 是阿里中间件开源的分布式事务解决方案. 前身是阿里的F ...

  3. 分布式事务之解决方案(XA和2PC)

    3. 分布式事务解决方案之2PC(两阶段提交) 针对不同的分布式场景业界常见的解决方案有2PC.TCC.可靠消息最终一致性.最大努力通知这几种. 3.1. 什么是2PC 2PC即两阶段提交协议,是将整 ...

  4. [转帖]分布式事务之解决方案(XA和2PC)

    分布式事务之解决方案(XA和2PC) https://zhuanlan.zhihu.com/p/93459200 3. 分布式事务解决方案之2PC(两阶段提交) 针对不同的分布式场景业界常见的解决方案 ...

  5. 【转帖】分布式事务之解决方案(XA和2PC)

    分布式事务之解决方案(XA和2PC) https://zhuanlan.zhihu.com/p/93459200 ​ 博彦信息技术有限公司 java工程师 3. 分布式事务解决方案之2PC(两阶段提交 ...

  6. 分布式事务二TCC

    分布式事务解决方案之TCC 4.1.什么是TCC事务 TCC是Try.Confirm.Cancel三个词语的缩写,TCC要求每个分支事务实现三个操作:预处理Try.确认Confirm.撤销Cancel ...

  7. 分布式事务一2PC

    分布式事务解决方案之2PC(两阶段提交) 前面已经学习了分布式事务的基础理论,以理论为基础,针对不同的分布式场景业界常见的解决方案有2PC.TCC.可靠消息最终一致性.最大努力通知这几种. 3.1.什 ...

  8. 分布式事务专题笔记(二)分布式事务解决方案之 2PC(两阶段提交)

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 前面已经了解了分布式事务的基础理论,以理论为基础,针对不同的分布式场景业界常见的解决方案有2PC.TCC ...

  9. SEATA 分布式事务入门DEMO

    Simple Extensible Autonomous Transacation Architecture,seata是简单的.可扩展.自主性高的分布式架构 SEATA Server Configu ...

随机推荐

  1. MaxCompute - ODPS重装上阵 第六弹 - User Defined Type

    MaxCompute(原ODPS)是阿里云自主研发的具有业界领先水平的分布式大数据处理平台, 尤其在集团内部得到广泛应用,支撑了多个BU的核心业务. MaxCompute除了持续优化性能外,也致力于提 ...

  2. [人物存档]【AI少女】【捏脸数据】少(烧)女前(钱)线

    点击下载(城通网盘):9.zip 点击下载(城通网盘):AISChaF_20191112224605286.png

  3. 27. ClustrixDB 分布式架构/一致性、容错和可用性

    一致性 许多分布式数据库都采用最终一致性而不是强一致性来实现可伸缩性.但是,最终的一致性会增加应用程序开发人员的复杂性,他们必须针对可能出现的数据不一致的异常进行开发. ClustrixDB提供了一个 ...

  4. Eclipse中文件结构的树形显示问题

    问题描述:在Eclipse中的SpringBoot文件显示层级消失. 这种情况下编辑代码的效率大大下降. 原因:Eclipse的工作模式不正确.上面的工作模式是Java模式.实际上应采用JavaEE模 ...

  5. 【CF521C】Pluses everywhere(贡献)

    题意:有一个长为n的数字字符串,要求其中插入k个加号,求所有合法表达式的和之和 0<=k<n<=1e5 思路:参考官方题解,讲的很好很清楚 字符串下标从0开始 考虑第i位d[i]的贡 ...

  6. 015 pip的使用

    目录 一.配置pip环境变量 二.Cmd终端使用pip 三.Pycharm使用pip 四.Jupyter使用pip 如果把python假想成一部手机,那么pip就是这部手机上的应用管家/APP,他可以 ...

  7. Java回调

    最近在看Spring的JdbcTemplate,有碰到很多的回调场景,在这里做一个笔记. 示例: 公司的经理出差时打电话给你让你帮他处理件事情,但不能一直通着电话,于是他让你办好事情后打电话告诉他一声 ...

  8. CF1213G Path Queries

    题目链接 问题分析 直接按边从小到大加入,求所有的连通点对数量即可.最后离线询问.使用并查集维护Size. 参考程序 #include <bits/stdc++.h> using name ...

  9. Mysql 实用语句记录

    都是工作中遇到的需求,但不是常用sql,特此记录,方便以后使用: 1.将指定列的数据拼起来存到某一列 UPDATE table_name SET b_col_name=CONCAT(b_col_nam ...

  10. python模块------pyautogui

    安装 pip install pyautogui 基本使用 查询 screenWidth, screenHeight = pyautogui.size() # 屏幕尺寸 mouseX, mouseY ...