TCC 事务方案
两个阶段的三种操作:
第一个阶段:
Try 预留资源,冻结数据
第二个阶段:
Confirm 确认资源,使用第一阶段冻结的数据,完成业务
Cancel 取消资源,把第一阶段冻结的数据,再恢复回去
有侵入的事务方案,所有数据操作都需要自己实现,之前学的业务代码需要调整,底层数据库表结构也要调整。
有些复杂情况下,AT事务方案无法自动进行事务控制,就需要手动控制的事务方案。
新建工程,导入无事务版本
1.新建 Empty project 工程: seata-tcc
2.seata-at/无事务版本.zip 解压缩到 seata-tcc 工程目录
3.double shift — action – 搜索add maven project
4.选择 order-parent 的 pom.xml 导入
添加 TCC 事务
1.seata 依赖
2.三个配置文件
application.yml 对事务组命名
registry.conf 连接eureka,获取 seata server (TC)的地址
file.conf 事务组对应使用的协调器
3.调整数据库表结构
4.Mapper 添加新的数据库操作
5.按 seata tcc 的规则,定义 TccAction 接口、实现 用来执行 TCC 三个操作
6.TccAction 的三个方法要添加 @Transactional,控制本地事务(和全局事务无关)
7.业务方法中,不再直接执行业务,要改成调用 TccAction 的第一阶段方法,冻结数据
8.第一个模块业务方法上添加 @GlobalTransactional
TCC 的三个方法,
第一阶段方法,需要手动调用
第二阶段方法,由 seata 的 RM 组件(资源管理器)接收TC指令,然后自动执行
TCC的两个问题
第一阶段冻结数据失败,第二阶段仍然会执行回滚,可能引起数据混乱
第二阶段,如果运行超时或出错,TC会重试执行第二阶段,
可能会重复的提交数据,或重复的回滚数据,造成数据混乱。
幂等性控制
一次操作成功,和多次操作的结果相同