分布式 事务 的 总结

# **一、**分布式事务

## 1、什么是分布式的事务
    在分布式的系统中不同服务之间需要通过网络远程协作需要完成的事务称为分布式事务 例如 用户注册送积分 创建订单减库存等等。
    用本地事务的方式处理分布式事务 是行不通的。
## 2、分布式事务带来的问题

    就是不能用本地事务那样来控制事务 这就是分布式事务。

## 3、分布式事务产生的场景

    微服务下 不同的服务用不同的 数据库,同一个服务用不同的数据库(分库了) 不同的微服务用相同的数据库。


## 二、分布式事务的解决方案

    常用的解决方案有 2pc , tcc ,消息队列 ,最大努力通知四种方案。


    ## 1、两阶段提交协议2PC

      分为两部分 准备阶段 和提交阶段 2 指两个阶段 p 指准备阶段 c 指提交阶段。
      分布式事务中由事务管理器和事务参与者组成,事务管理器负责事务的最终的提交或者回滚。
      准备阶段:事务管理器 让每个数据库 开始准备开启本地事务,但是没有提交 并且让数据库记录修改前和修改后的数据。这是数据是锁定的。
      提交阶段:事务管理器 在准备阶段收到的都是 成功的信号 然后就发出commit 指令 完成事务。如果 收到了准备阶段的 error 信息则会发出callback       指令。这时无论提交
      或者回滚 资源都会释放的。


      1.1 XA 解决方案 效率比较低 需要 所有的事务分支 都提交或者都回滚之后才释放资源。
      1.2 seata 方案 是个框架 无侵入性 以注册用户送积分为例说明
      TM 事务管理器 (负责开启全局的事务 并且最终向 tc 发送全局的提交或者 回滚)
      RM 资源管理器 (向数据库发起指令 提交或者回滚)
      TC 事务协调器 (用来接收TM 的指令 发起全局事务的提交或者回滚,还负责和各各 分支 事务的提交或者回滚)

      步骤:

​          1)、用户服务那里有TM TM 向TC 发起一个全局的事务 生成一个全局的 XID

​          2)、用户服务 RM 向 TC 注册分支事务 并且 该分支事务用来 新增用户的,并且该事务由TC管理。

​          3)、用户分支事务向数据库添加一条数据,事务提交,释放锁。写undo_log

          4)、逻辑执行到 添加积分服务时 积分服务RM也向 TC注册一个分支事务,该事务用来添加积分,该事务由TC管理。

          5)、积分分支事务 向数据库添加一条积分记录,事务提交 释放锁。写 udo_log

          6)、添加用户和添加积分 逻辑执行完毕 TM向TC 发送全局提交或者回滚的指令。

         7)、TC 调度 XID 管理的分支事务提交或者回滚。 如果提交删除 各各分支的udo_log 记录。如果 回滚 根据undo_log 记录的日志 把原来的数据 返回来 删                                        除 undo_log

        这样实现了 两个 事务的一起成功一起失败。

  具体的代码 地址

             https://pan.baidu.com/s/19ID-D6aM859kdlwnEcSH8Q

         

猜你喜欢

转载自www.cnblogs.com/gaohq/p/11999863.html