1.分布式事务概论

1.常规事务

1.1事务特性(刚性事务)
  • A(Atomicity):原子性
  • C(Consistency):一致性
  • I(Isolation):隔离性
  • D(Durability):持久性
1.2事务形式
  • 编程式:
    使用 TransactionTemplate 或者直接使用底层的 TransactionManager 来操作事务 commit 或者 rollback。
  • 声明式:
    建立在 AOP 基础上,通过对方法前后进行拦截,加入编程式事务里的流程控制逻辑。使用的时候只需要在方法前 面加上@Transactional 注解

2.分布式事务

2.1 概念

就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用。在这种环境中,我们之前说过数据库的 ACID 四大特性,已经无法满足我们分布式事务。

本质上来说,分布式事务就是为了保证不同数据库的数据一致性。

2.2 CAP理论

一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。

在一个分布式系统中,最多只能满足 C、A、P 中的两个,不可能三个同时满足。

  • 分布式系统中,网络无法 100% 可靠,分区(P)其实是一个必然现象。
  • 任何横向扩展策略都要依赖于数据分区。因此,设计人员必须在一致性(CP)与可用性(AP)之间做出选择。
2.3 BASE理论

往往在分布式系统中无法实现完全一致性,于是有了 BASE 理论,它是对 CAP 定律的进一步扩充

  • Basically Available(基本可用) : 分布式系统在出现故障时,允许损失部分可用功能,保证核心功能可用
  • Soft state(软状态) : 允许系统中存在中间状态,这个状态不影响系统可用性
  • Eventually consistent(最终一致性) : 经过一段时间后,所有节点数据都将会达到一致

BASE和ACID对比:
BASE 和 ACID 是相反的,它完全不同于 ACID 的强一致性模型,而是通过牺牲强一致性来获得可用性,并允许数据在一段时间内是不一致的,但最终达到一致状态

2.4 2PC
  • 流程图


    image.png

第一阶段:
每个请求发出预备提交请求,并作出相应的应答,如果都成功,进行第二阶段。
第二阶段:
每个请求发出提交请求,并作出相应应答,如果成功,代表commit完成,有一个不成功,回滚。

优点:
尽量保证了数据的强一致,实现成本较低,在各大主流数据库都有自己实现,对于 MySQL 是从 5.5 开始支持。

缺点:

  • 单点问题 : 事务管理器在整个流程中扮演的角色很关键,如果其宕机,比如在第一阶段已经完成,在第二阶段正准备提交的时候事务管理器宕机,资源管理器就会一直阻塞,导致数据库无法使用。
  • 同步阻塞 : 在准备就绪之后,资源管理器中的资源一直处于阻塞,直到提交完成,释放资源。
  • 数据不一致 : 两阶段提交协议虽然为分布式数据强一致性所设计,但仍然存在数据不一致性的可能。
    比如在第二阶段中,假设协调者发出了事务 Commit 的通知,但是因为网络问题该通知仅被一部分参与者所收到并执行 了 Commit 操作,其余的参与者则因为没有收到通知一直处于阻塞状态,这时候就产生了数据的不一致性。
  • 两阶段提交方案锁定资源时间长,对性能影响很大,基本不适合解决微服务事务问题。
2.5 3PC

2PC改进版本,将事务的提交过程分为CanCommit、PreCommit、do Commit三个阶段来进行处理


image.png
  • 第一阶段CanCommit(这一阶段主要是确定分布式事务的参与者是否具备了完成 commit 的条件,并不会执行事务操作)
    询问是否可以提交事务CanCommit,如果可以反馈YES,否则反馈NO。
  • 第二阶段PreCommit
    1.当所有参与者均反馈YES,即执行事务预提交(PreCommit)
    2.任何一个参与者反馈NO,或者等待超时后协调者尚无法收到所有参与者的反馈,即中断事务。
  • 第三阶段do Commit
    1.所有参与者均反馈Ack响应,即执行真正的事务提交
    2.任何一个参与者反馈NO,或者等待超时后协调者尚无法收到所有参与者的反馈,即中断事务

3PC对比2PC:
注意:在阶段三,可能会出现 2 种故障:协调者出现问题/协调者和参与者之间的网络故障,一段出现了任一一种情况,最终都会导致参与者无法收到 doCommit 请求或者 abort 请求, 针对这种情况,参与者都会在等待超时之后,继续进行事务提交。
优点:
最大的优点是减少了参与者的阻塞范围(第一个阶段是不阻塞的),能够在单点故障后继续达成一致(2PC 在提交阶段会出现此问题,而 3PC 会根据协调者的状态进行回滚或者提交)。
缺点:
如果参与者收到了 preCommit 消息后,出现了网络分区,那么参与者等待超时后,都会进行事务的提交,这必然会出现事务不一致的问题

2.6 TCC

TCC 其实就是采用的补偿机制,其 核心思想 是:
针对每个操作,都要注册一个与其业务逻辑对应的确认和补偿(撤销)操作。 其将整个业务逻辑的每个分支显式的分成了 Try、Confirm、Cancel 三个操作。

  • Try 部分完成业务的准备工作
  • confirm 部分完成业务的提交
  • cancel 部分完成事务的回滚


    image.png

优点:
跟 2PC 比起来,实现以及流程相对简单了一些,但数据的一致性比 2PC 也要差一些
缺点:
TCC 属于 应用层 的一种补偿方式,所以需要程序员在实现的时候多写很多补偿的代码,而且补偿的时候也有可能失败,在一些场景中,一些 业务流程可能用 TCC 不太好定义及处理。

3.分布式事务框架

3.1 LCN

LCN 并不生产事务,LCN 只是本地事务的协调工
TX-LCN 定位于一款事务协调性框架,框架其本身并不操作事务,而是基于对事务的协调从而达到事务一致性的效果

原理:
TX-LCN 由两大模块组成: TxClient、TxManager
原理流程图:


image.png
  • 1.创建事务组
    是指在事务发起方开始执行业务代码之前先调用 TxManager 创建事务组对象,然后拿到事务标示 GroupId 的过程。
  • 2.加入事务组
    添加事务组是指参与方在执行完业务方法以后,将该模块的事务信息通知给 TxManager 的操作。
  • 3.通知事务组
    是指在发起方执行完业务代码以后,将发起方执行结果状态通知给 TxManager,TxManager 将根据事务最终状态和事务组的信息 来通知相应的参与模块提交或回滚事务,并返回结果给事务发起方。

你可能感兴趣的:(1.分布式事务概论)