seata+nacos实现TCC模式分布式事务

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注解标识

image.png

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;
    }
}
=
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值