07-分布式事务

一.事务理解

1.本地事务

  • 1.单数据源事务

      使用Spring中的@Transactional即可
  • 2.多数据源事务

      当本地中使用的是多数据源时,Spring自带@Transactional不能解决;因为多数据源的  
      切换过程中会导致事务失败,所以需要用多数据源事务解决方案 
    
      JTA/XA  atomikos+druid的xaDatasource  
    
      JTA/XA解决多数据源事务的原理: 
      -1. 需要一个全局事务管理器 
      -2. 实现XA协议的资源,即每个多数据源数据库 

2.微服务架构下的分布式事务

  • TCC (try commit cancel)

    • try接口:预留资源(比如冻结库存、预加积分、创建草稿状态出货单)

    • commit接口:真正确认资源,修改中间try阶段中间状态为确认状态

    • cancel接口:如果上层出现异常,需要释放try阶段的预留资源

关于try预留资源一般设计:

    比如一个扣库存服务,一般有stock(库存)、freeze(冻结字段),比如说现在库存还有10。  
    预留阶段:给freeze字段加1,stock不变,其他服务线程可以使用的库存为stock-freeze=9  
    commit阶段:确认资源,将stock变为stock-1,freeze变为freeze-1  
    cancel阶段:释放预留资源阶段,stocke不变,freeze变为freeze-1

    TCC 的开源框架实现 
    Atomikos(高级功能收费),tcc-transaction,ByteTcc    
  • 可靠消息(RocketMQ)

B站分布式事务视频:https://www.bilibili.com/video/av60827231?p=3

二.2PC

  • 第一阶段(预留资源):预提交、预先锁定资源(订单库存)、预先校验数据库,缓存中间件是否正常等

  • 第二阶段(确认资源): 确认第一阶段锁定的资源

三.消息中间件事务消息-实现分布式事务 SOFAStack(RocketMQ)消息队列

Last updated

Was this helpful?