上一篇 https://my.oschina.net/u/3901188/blog/4316832 已经完成了 Seata 的服务端 整合 nacos 的搭建启动。本篇章记录 Seata 客户端实现模拟分布式事务场景。
分布式事务场景准备:客户端分三个服务 order订单服务、storage库存服务、account账户余额服务。三个服务对应的独立的数据库。
库需要自行建立,我这里创建的名称为 seata_order、seata_account、seata_storage 三个库名称。sql的建库建表语句我都写代在项目的sql文件夹中。
写在这里太过于长了,太占地方了,项目demo我直接打包上传上码云了。项目地址链接: https://gitee.com/maogouxiong/seata-nacos-test-demo 需要的伙伴可以上去下载下来自行测试。
这里我主要关键点:
项目我使用了 mybatis-plus 的代码生成器直接生成代码。代码生成器类我放在了每个服务项目的test目录下。
另外代理数据源是要配置的。在代码里面每个服务都有配置代理数据源,需要留意看下
我这里测试 Seata 服务端是通过源码启动的。源码启动看下我上一篇文章有讲到。
先启动 Seata 服务端,当 Seata 服务端启动成功,启动日志是这样的:
然后启动 三个客户端服务, 当 order订单服务、storage库存服务、account账户余额服务 三个服务启动成功,启动日志是下三图所示:
三个服务启动成功后,Seata 服务端是收到对应的通知:
然后分布式事务流程是这样的:
1、浏览器或者postman测试工具访问 order服务创建订单。 2、order服务创建订单过程中,使用 Feign 远程调用库存服务进行减库存,调用用户余额服务进行减余额。 3、接着order服务更新订单状态。 最后模拟出现异常 int a = 1/0 ,seata 实现分布式事务回滚。
整个过程中,只需要在远程调用方的方法上加上 @GlobalTransactional(rollbackFor = Exception.class) 注解即可。
原始的数据:
正常commit事务:
数据库数据变化:
三个服务日志输出:
Seata 服务端:
失败回滚事务:
数据库数据没变化:
三个服务日志输出:
Seata 服务端:
来源:oschina
链接:https://my.oschina.net/u/3901188/blog/4316844