参考资料:
Seata server端的配置,maven依赖等可参考 ——https://www.cnblogs.com/life-of-coding/p/13216986.html
使用 seata 的 TCC 模式全局事务,需要被调用方使用接口,并配合对应的注解来实现,接口需要定义 TCC 各个阶段需要调用的方法。
@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 模式下的配置一致。
原文:https://www.cnblogs.com/life-of-coding/p/13289385.html