当前位置: 首页 > news >正文

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

文章目录

  • 分布式事务seata
    • 引入
    • 理论基础
      • CAP定理
      • BASE理论
    • 初识Seata
    • 动手实践
      • XA模式
      • AT模式
      • TCC模式
      • SAGA模式
    • 高可用

分布式事务seata

引入

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

理论基础

CAP定理

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

BASE理论

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

初识Seata

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

动手实践

XA模式

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

AT模式

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

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

TCC模式

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

@Service
@Slf4j
public class AccountTCCServiceImpl implements AccountTCCService {@Autowiredprivate AccountMapper accountMapper;@Autowiredprivate AccountFreezeMapper freezeMapper;@Override@Transactionalpublic void deduct(String userId, int money) {// 0.获取事务idString 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);}@Overridepublic boolean confirm(BusinessActionContext ctx) {// 1.获取事务idString xid = ctx.getXid();// 2.根据id删除冻结记录int count = freezeMapper.deleteById(xid);return count == 1;}@Overridepublic 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.将冻结金额清零,状态改为CANCELfreeze.setFreezeMoney(0);freeze.setState(AccountFreeze.State.CANCEL);int count = freezeMapper.updateById(freeze);return count == 1;}
}

SAGA模式

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

高可用

在这里插入图片描述

http://www.lryc.cn/news/366940.html

相关文章:

  • vue用vite配置代理解决跨域问题(target、rewrite和changeOrigin的使用场景)
  • 为什么PPT录制没有声音 电脑ppt录屏没有声音怎么办
  • JDBC学习笔记(三)高级篇
  • c++编译器在什么情况下会提供类的默认构造函数等,与析构函数
  • SpringBoot3整合Mybatis-Plus3.5.5出现的问题
  • 服务器数据恢复—强制上线raid5阵列离线硬盘导致raid不可用的数据恢复案例
  • 初入阿里云,上手走一波
  • [C++] 小游戏 斗破苍穹 2.2.1至2.11.5所有版本(中) zty出品
  • Javaweb---HTTPS
  • [已解决]ESP32-C3上传程序成功但没有反应的问题
  • 使用 OCLint进行静态代码分析:一个完整的配置示例
  • 【Linux】线程的互斥
  • electron如何让你窗口总是显示在最前面【mac解决全屏窗口alwaysOnTop参数不起作用】
  • XR和Steam VR项目合并问题
  • uni-app:利用Vue的原型对象Vue.prototype设置全局方法及其引用
  • django接入djangorestframework-simplejwt步骤
  • 前端工程化工具系列(十)—— Browserslist:浏览器兼容性配置工具
  • 双列集合底层源码
  • 【Ardiuno】实验使用ESP32连接Wifi(图文)
  • 优化家庭网络,路由器无线中继配置全攻略(中兴E1600无线中继设置/如何解决没有预埋有线网络接口的问题/使用闲置路由实现WIFI扩展)
  • 【ArcGIS微课1000例】0114:基于DEM地形数据整体抬升或下降高程
  • AGP4+ 打包运行闪退,AGP7+ 正常(has code but is marked native or abstract)
  • ChatGPT3.5和ChatGPT4.0、ChatGPT4o对比
  • 【知识拓展】HTTP、WebSocket 和 RPC:区别与使用场景详解
  • C语言printf( ) 函数和 scanf( ) 函数格式符的修饰符 “*”有什么作⽤?
  • java 使用WebClient发送https请求
  • Python 中的内存管理机制
  • Mac电脑重置网络命令
  • C++期末复习总结(2)
  • [word] word大括号怎么打两行 #其他#其他#微信