分布式事务与Seate框架

https://www.cnblogs.com/jian0110/p/14925087.html

https://www.cnblogs.com/jian0110/p/14762509.html

  • AP: Application 表示应用程序
  • RM: Resource Manager 资源管理器,比如数据库
  • TM: Transaction Manager 表示事务管理器,协调事务和管理资源,类似于Spring的Transaction Manager。

一、AT模式介绍

  同样地,还是得先复习下分布式事务的相关理论部分:AT模式是Seata最主推的分布式事务且基于XA演进而来的解决方案,主要有三个角色:TM、RM和TC,其中TM和RM作为Seata的客户端和业务集成,TC作为Seata服务器独立部署TM向TC注册一个全局事务并生成全局唯一的XID;在AT模式下,数据库资源被当做RM,访问RM时,Seata会对请求进行拦截;每个本地事务提交时,RM会向TC(Transaction Coordinator,事务协调器)注册一个分支事务。

从三个角色TM、RM和TC的角度来记录具体的流程的话,可以总结如下:

  • TM向TC注册全局事务,并生成全局唯一XID;
  • RM向TC注册分支事务,并将其纳入到该XID对应的全局事务范围。
  • RM向TC汇报资源的准备状态
  • TC汇总所有事务参与者的执行状态,决定分布式事务全部回滚还是提交
  • TC通知所有的RM提交/回滚事务

从具体的微服务角度总结,假设分别有三个:MicroService-1, MicroService-2, MicroService-3,流程图如下:

二、Seata AT模式的实现原理

1. AT模式的第一阶段实现

  解析业务SQL,更新业务数据,保存更新前后镜像到undo_log。在业务操作数据库流程中,Seata会基于数据源代理(0.9以后支持自动代理)对原执行SQL进行解析。之后通过本地事务的ACID特性,将这两步操作(保存业务数据前后镜像到undo_log, 更新业务数据)在本地事务中进行提交

 

 

 

订单服务:

    TM(microService):seata-order-service

    RM(DB Resources):jdbc:mysql://127.0.0.1:3306/order

@GlobalTransactional // TM开启全局事务 @Transactional(rollbackFor = Exception.class)

// 这里先检查有没有库存了, 生产环境下这里是需要for update数据库锁,或者分布式锁

1.TCC补偿型方案(互联网最常用的方案)

TCC 是一种比较成熟的分布式数据一致性解决方案,实际上是把一个完整业务拆分为三个步骤:

  Try:主要是数据的校验或者资源的预留;

  Confirm:确认真正执行的任务,只操作Try阶段预留的资源;

  Cancel:取消执行,释放Try阶段预留的资源。

其实TCC是2PC的思想,第一阶段通过Try进行准备工作,第二阶段Confirm/Cancel表示Try阶段操作的确认和回滚

 

 

小蚊子大人
原文地址:https://www.cnblogs.com/ywsheng/p/14930550.html