微服务学习Day9-分布式事务Seata

分布式事务seata

引入

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

理论基础

CAP定理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

BASE理论

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

初识Seata

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

动手实践

XA模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

AT模式

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

TCC模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

@Service
@Slf4j
public class AccountTCCServiceImpl implements AccountTCCService {

    @Autowired
    private AccountMapper accountMapper;
    @Autowired
    private AccountFreezeMapper freezeMapper;

    @Override
    @Transactional
    public void deduct(String userId, int money) {
        // 0.获取事务id
        String xid = RootContext.getXID();
        //1.判断freeze中是否有冻结记录,如果有,一定是CANCEL执行过,我要拒绝业务
        AccountFreeze oldFreeze = freezeMapper.selectById(xid);
        if (oldFreeze != null){
            //CANCEL执行过,我要拒绝业务
            return;
        }
        // 1.扣减可用余额
        accountMapper.deduct(userId, money);
        // 2.记录冻结金额,事务状态
        AccountFreeze freeze = new AccountFreeze();
        freeze.setUserId(userId);
        freeze.setFreezeMoney(money);
        freeze.setState(AccountFreeze.State.TRY);
        freeze.setXid(xid);
        freezeMapper.insert(freeze);
    }

    @Override
    public boolean confirm(BusinessActionContext ctx) {
        // 1.获取事务id
        String xid = ctx.getXid();
        // 2.根据id删除冻结记录
        int count = freezeMapper.deleteById(xid);
        return count == 1;
    }

    @Override
    public boolean cancel(BusinessActionContext ctx) {
        // 0.查询冻结记录
        String xid = ctx.getXid();
        String userId = ctx.getActionContext("userId").toString();
        AccountFreeze freeze = freezeMapper.selectById(xid);
        //1.空回滚的判断,判断freeze是否为null,为null证明try没执行,需要空回滚
        if (freeze == null){
            freeze = new AccountFreeze();
            freeze.setUserId(userId);
            freeze.setFreezeMoney(0);
            freeze.setState(AccountFreeze.State.CANCEL);
            freeze.setXid(xid);
            freezeMapper.insert(freeze);
            return true;
        }
        //2.幂等判断
        if (freeze.getState() == AccountFreeze.State.CANCEL) {
            //已经处理过一次CANCEL,无需重复处理
            return true;
        }
        // 1.恢复可用余额
        accountMapper.refund(freeze.getUserId(), freeze.getFreezeMoney());
        // 2.将冻结金额清零,状态改为CANCEL
        freeze.setFreezeMoney(0);
        freeze.setState(AccountFreeze.State.CANCEL);
        int count = freezeMapper.updateById(freeze);
        return count == 1;
    }
}

SAGA模式

在这里插入图片描述
在这里插入图片描述

高可用

在这里插入图片描述

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-08 17:12:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-08 17:12:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-08 17:12:03       82 阅读
  4. Python语言-面向对象

    2024-06-08 17:12:03       91 阅读

热门阅读

  1. 【VVC】类和编码树了解

    2024-06-08 17:12:03       26 阅读
  2. golang优雅代码【lock实现】

    2024-06-08 17:12:03       31 阅读
  3. 堆排序---C语言

    2024-06-08 17:12:03       33 阅读
  4. [AIGC] 自定义Spring Boot中BigDecimal的序列化方式

    2024-06-08 17:12:03       27 阅读
  5. Pinia的定义及使用

    2024-06-08 17:12:03       26 阅读
  6. 信奥之路(五)——顺序结构

    2024-06-08 17:12:03       29 阅读
  7. 【HarmonyOS】代码规范参考

    2024-06-08 17:12:03       28 阅读
  8. 力扣每日一题 6/5

    2024-06-08 17:12:03       31 阅读
  9. Ansible——setup模块

    2024-06-08 17:12:03       30 阅读
  10. 开关电源中电感设计

    2024-06-08 17:12:03       34 阅读