分布式事务方案汇总及Seata详解( 二 )

  • 库存系统消费扣减库存消息,执行本地事务,如果扣减失败 , 消息会重新投,一旦超出重试次数,则本地表持久化失败消息 , 并启动定时任务做补偿 。
  • 基于消息中间件的两阶段提交方案,通常用在高并发场景下使用,牺牲数据的强一致性换取性能的大幅提升,不过实现这种方式的成本和复杂度是比较高的,还要看实际业务情况 。
    基于RokectMQ实现最终一致性具体实现可参考:订单系统中的数据一致性方案及RocketMQ事务消息详解
    分布式事务SeataSeata 也是从两段提交演变而来的一种分布式事务解决方案,提供了 AT、TCC、SAGA 和 XA 等事务模式 。
    • XA模式:强一致性分阶段事务模式 , 牺牲了一定的可用性,无业务侵入
    • TCC模式:最终一致的分阶段事务模式 , 有业务侵入
    • AT模式:最终一致的分阶段事务模式,无业务侵入,也是Seata的默认模式
    • SAGA模式:长事务模式,有业务侵入
    Seata事务管理中有三个重要的角色:
    分布式事务方案汇总及Seata详解

    文章插图
    • TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚 。
    • TM (Transaction Manager) - 事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务 。
    • RM (Resource Manager) - 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚 。
    Seata实现原理(1)XA模式seata的XA模式做了一些调整 , 但大体相似:
    RM一阶段的工作:
    • 注册分支事务到TC
    • 执行分支业务sql但不提交
    • 报告执行状态到TC
    TC二阶段的工作:
    • TC检测各分支事务执行状态:如果都成功,通知所有RM提交事务;如果有失败,通知所有RM回滚事务
    RM二阶段的工作:
    • 接收TC指令 , 提交或回滚事务

    分布式事务方案汇总及Seata详解

    文章插图
    XA模式
    【XA模式实现】Seata的starter已经完成了XA模式的自动装配,实现非常简单,步骤如下:
    1、修改Application.yml文件,开启XA模式:
    seata: data-source-proxy-mode: XA # 开启数据源代理的XA模式
    • 1.
    • 2.
    2、给发起全局事务的入口方法添加@GlobalTransactional注解,
    @GlobalTransactionalpublic Long create(Order order) {// 创建订单orderMapper.insert(order);// 扣余额 ...略// 扣减库存 ...略return order.getId();}
    • 1.
    • 2.
    • 3.
    • 4.
    • 5.
    • 6.
    • 7.
    • 8.
    (2)AT模式AT模式同样是分阶段提交的事务模型 , 但缺弥补了XA模型中资源锁定周期过长的缺陷 。
    阶段一RM的工作:
    • 注册分支事务
    • 记录undo-log(数据快照)
    • 执行业务sql并提交
    • 报告事务状态
    阶段二提交时RM的工作:
    • 删除undo-log即可
    阶段二回滚时RM的工作:
    • 根据undo-log恢复数据到更新前

    分布式事务方案汇总及Seata详解

    文章插图
    AT模式
    执行流程如下:
    分布式事务方案汇总及Seata详解

    文章插图
    (3)TCC模式TCC模式与AT模式非常相似 , 每阶段都是独立事务,不同的是TCC通过人工编码来实现数据恢复 。需要实现三个方法: