学习链接:分布式事务(三)Seata分布式事务框架-AT模式介绍
saeta 事务适用于80%的业务场景
事务协调器 TC
seata-server 启动配置
file.conf
seata-server
启动seata-server
seata-server.bat
查看注册表
注意:
- 必须使用jdk1.8
- 命令窗口不能关闭
- 命令窗口不能选中,否则运行的应用会挂起,暂停
选中后右键或esc取消选中,
一,在业务模块中 Seata At 事务
-
seata 依赖
-
配置
application.yml ---- 事务组的组名
registry.conf ---- 注册中心的地址
file.conf ---- 事务组对应使用哪个协调器与之前启动时配置内容不同
-
在自动配置类中,创建数据源代理对象,用来执行AT事务的自动事务控制代码
sql语句交给数据源代理对象处理datasource proxy ,新旧数据保存到回滚日志表 -
业务方法添加注解
@Transactional ---- 只用来控制本地事务
@GlableTansactional -----启动全局事务 ,只需要在第一个模块添加
学习链接:分布式事务(五)Seata AT模式-Spring Cloud微服务添加 AT 分布式事务
1 order订单服务添加 Seata AT 事务
1.1 seata工程无事务版本 依赖打开
如果只添加了依赖,没有做后面配置步骤,或配置错误,项目无法启动
1.2 配置
application
1.3 单独启动订单业务测试
GET http://localhost:8083/create?userId=1&productId=1&count=10&money=100
2 storage库存服务添加 Seata AT 事务
1.3启动测试
GET http://localhost:8083/create?userId=1&productId=1&count=10&money=100
3 account 账户服务添加 Seata AT 事务
- 复制
file.conf,registry.conf,DSAutoConfig
application.yml
中添加指定的事务组 组名- datasource下添加 jdbc-url
- 启动类中 排除spring的数据源配置,使用自定义的数据源自动配置类
AccountServiceImpl
中添加本地事务注解
测试
打开OrderServiceImpl 中调用account
三个服务 都能看到 事务提交日志
GET http://localhost:8083/create?userId=1&productId=1&count=10&money=100
回滚 测试
在AccountServiceImpl中添加随机异常测试
建议先初始化数据库
GET http://localhost:8083/create?userId=1&productId=1&count=10&money=100
二,Seata TCC模式
学习链接: 分布式事务(六)Seata TCC模式-TCC模式介绍
学习链接: 分布式事务(七)Seata TCC模式-Spring Cloud微服务添加 TCC 分布式事务
-
新建Empty project: seata-tcc
-
seata-at 无事务版本.zip,解压到seata-tcc目录
-
导入模块
-
seata-依赖
-
配置
application.yml
registry.conf
file.conf -
修改Mapper ,添加数据库操作
-
按照seata tcc规则,添加TccAction接口和实现类
三个方法上都要添加@Transactional -
修改业务代码 ,手动调用 tcc 的第一阶段方法(冻结数据),
第二阶段(提交或回滚) ,由RM资源管理器控制执行 -
在第一个模块添加注解 @GlobalTransactional
order
6 修改Mapper ,添加数据库操作
创建冻结订单sql
注意order
是关键字,需用反引号包裹
修改订单状态sql
删除订单sql
7. 按照seata tcc规则,添加TccAction接口和实现类
三个方法上都要添加@Transactional
8. 修改业务代码 ,手动调用 tcc 的第一阶段方法(冻结数据),
第二阶段(提交或回滚) ,由RM资源管理器控制执行
9. 在第一个模块添加注解 @GlobalTransactional
storage
测试
两个问题
- 第一阶段冻结数据如果失败,第二阶段的回滚仍然会执行
1000 0
1100 -100
可用变负数, - 出错或超时可能会重复执行提交,回滚数据
如果第二阶段执行出错,或者超时,TC会重复下发指令,要求这个模块重新执行第二阶段操作
重置数据
解决 幂等性
多次操作,和第一次操作的结果相同
account
测试
初始数据
GET http://localhost:8083/create?userId=1&productId=1&count=10&money=100