1、简介
AT 模式(参考链接 TBD)基于 支持本地 ACID 事务 的 关系型数据库 :
TCC 模式,不依赖于底层数据资源的事务支持。
2、建立项目
TCC 模式的 maven 依赖引入,项目配置和 AT 模式相同,可以参考 seata+nacos 实现 AT 模式分布式事务的第 2 节,完成代码到 git 上下载,TCC 模式在 tcc 分支下,脚本在 script 目录下(和 AT 模式的数据库脚本一致,选择一个执行即可)
https://gitee.com/WylLoveX/seata.git
3、使用
TM 端依然使用 @GlobalTransactional 注解标识
RM 端需要单独标识出来
@LocalTCC 将资源注册到 TC
@TwoPhaseBusinessAction 将资源标时为二阶段提交的 try 阶段,这里需要在指定二阶段对应的 Confirm 和 Cancel
@BusinessActionContextParameter 标时这个一个二阶段参数,后续可以在 BusinessActionContext 中获取
/** * @author Mr.Wen * @version 1.0 * @date 2021-10-25 14:03 */ @LocalTCC public interface BankUserService { @TwoPhaseBusinessAction(name = "reduceAccount",commitMethod = "commitReduceAccount",rollbackMethod = "rollbackReduceAccount") int reduceAccount( @BusinessActionContextParameter(paramName ="id") String id, @BusinessActionContextParameter(paramName ="num") Integer num); boolean commitReduceAccount(BusinessActionContext context); boolean rollbackReduceAccount(BusinessActionContext context); }
提交的时候,我们减少了账户的金额,此时发生故障,在二阶段的 cancel 中自定义回滚(这里将金额改为原来的值),若正常提交,就执行二阶段的 confirm
/** * @author Mr.Wen * @version 1.0 * @date 2021-10-25 14:04 */ @Service public class BankUserServiceImpl implements BankUserService { @Resource private BankUserMapper bankUserMapper; @Override public int reduceAccount(String id,Integer num) { int effectNum = bankUserMapper.reduceAccount(id,num); if(effectNum == 0){ throw new RuntimeException("减库存失败"); } int i= 1/0; return effectNum; } @Override public boolean commitReduceAccount(BusinessActionContext context) { System.out.println("xid="+context.getXid()+"提交成功"); // todo 如果有预留资源提交预留资源 return true; } @Override public boolean rollbackReduceAccount(BusinessActionContext context) { System.out.println("xid="+context.getXid()+"提交失败"); // todo 这里需要执行补偿逻辑, String id = (String) context.getActionContext("id"); Integer num = (Integer) context.getActionContext("num"); bankUserMapper.decreaseAccount(id,num); return true; } } =
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于