Seata(TCC)+SpringCloud实现全局事务
概述
参考资料:
- Spring Cloud集成seata分布式事务-TCC模式
- 部分配置可参考之前写的笔记——Seata实现Sprincloud(Eureka+Feign)事务
实现
Seata server端的配置,maven依赖等可参考 ——https://www.cnblogs.com/life-of-coding/p/13216986.html
被调用方
seata 的 TCC 模式全局事务,需要被调用方使用接口,并配合对应的注解来实现,接口需要定义 TCC 各个阶段需要调用的方法。
接口需要实现的三个方法:
- 用于业务预处理的方法,即 Try 阶段、的方法,比如冻结用户的部分余额等等;
- 用于提交业务的方法,即 Commit 方法,比如扣除用户之前冻结的部分余额;
- 用于回滚业务的方法,即 Rollback 方法,比如返还之前冻结的用户余额;
被调用方需要用到的几个注解:
-
@LocalTCC (必要)
该注解需要添加到上面描述的接口上,表示实现该接口的类被 seata 来管理,seata 根据事务的状态,自动调用我们定义的方法,如果没问题则调用 Commit 方法,否则调用 Rollback 方法。 -
@TwoPhaseBusinessAction (必要)
该注解用在接口的 Try 方法上,该注解的用法如下:
@TwoPhaseBusinessAction(name = "tryTcc", commitMethod = "commitTcc", rollbackMethod = "cancelTcc")
该注解包含这几个属性:
* name 为 tcc 方法的 bean 名称,需要全局唯一,一般写方法名即可;
* commitMethod 自然地写 Commit 方法的方法名;
* rollbackMethod 写 Rollback 方法的方法名;
-
@BusinessActionContextParameter
该注解用来修饰 Try 方法的入参,被修饰的入参可以在 Commit 方法和 Rollback 方法中通过 BusinessActionContext 获取。
该注解的用法如下:@TwoPhaseBusinessAction(name = "tryBusiness", commitMethod = "commitTcc", rollbackMethod = "cancelTcc") String tryBusiness (@BusinessActionContextParameter(paramName = "orderId") String id)
可以使用 Map 传多个参数:
@TwoPhaseBusinessAction(name = "tryBusiness", commitMethod = "commitTcc", rollbackMethod = "cancelTcc") String tryBusiness (@BusinessActionContextParameter(paramName = "params") Map<String, String> params)
在接口方法的实现代码中,可以通过 BusinessActionContext 来获取参数, BusinessActionContext 就是 seata tcc 的事务上下文,用于存放 tcc 事务的一些关键数据。BusinessActionContext 对象可以直接作为 commit 方法和 rollbakc 方法的参数,Seata 会自动注入参数:
@Override public boolean commitTcc(BusinessActionContext context) { String orderId = context.getActionContext("oderId"); return true; }
注意参数名要和 Try 方法里的定义保持一致。
调用方
调用方是通过 Feign 进行服务的调用,调用方的配置,在需要实现全局事务的方法上加上 “@GlobalTransactional” 注解即可,与 AT 模式下的配置一致。