分布式事务
分布式事务,分为两类:
- 内部分布式事务:分布式数据库(Spanner、TiDB)跨节点的内部事务。
- 异构分布式事务:跨服务、跨数据库的事务。
DTM 用于解决异构分布式事务的一致性问题。在下文中,分布式事务特指异构分布式事务。以下是异构分布式事务(跨数据库、跨服务、混合)的示意图。
事务的一致性:
- 本地事务使用 MVCC 技术,支持高并发(隔离级别为 Repeatable Read)下的一致性。
- 内部分布式事务也可以通过 MVCC 技术,保证严格的一致性。
- 异构分布式事务,因为没有统一的版本号,无法做 MVCC。目前没用支持跨数据库的严格一致性方案。
分布式事务一致性分类
对于事务的 ACID 特性,原子性、隔离性和持久性是严格遵守的,但是目前没用严格的一致性解决方案。所以在异构分布式事务方面,采用宽松的一致性。
分布式事务模式
SAGA
SAGA 属于长事务解决方案,其核心思想就是把一个分布式事务拆分成多个本地事务,每个本地事务都有相应的执行模块和补偿模块(补偿模块与执行模块必须是幂等的,且必须是能够成功的),当 SAGA 事务中任意一个本地事务出错时,可以通过调用相关的补偿方法恢复之前的事务,达到事务最终一致性。
SAGA 模式的恢复其实有两种:向后恢复(Backward Recovery)和向前恢复(Forward Recovery):
- 后向恢复:撤销掉之前所有成功子事务。
- 前向恢复:重试失败的事务,适用于必须要成功的场景,这种情况下不需要补偿模块。
SAGA 满足 ACD 三个特性:
- 原子性:SAGA 协调器协调事务链中的本地事务要么全部提交,要么全部回滚。
- 一致性:SAGA 可以实现最终一致性。
- 持久性:基于本地事务,可以实现持久性。
但是缺乏隔离性会引发脏读、幻读和不可重复读等问题,因此需要在业务设计上去解决这个问题。通常在应用层面通过逻辑锁或者串行化操作来确保读取数据的准确性。
Saga事务的特点:
- 并发度高,不用像 XA 事务那样长期锁定资源。
- 需要定义正常操作以及补偿操作,开发量比 XA 大。
- 一致性较弱,对于转账,可能发生A用户已扣款,最后转账又失败的情况。
TCC
TCC(Try-Confirm-Cancel)的核心思想就是,针对每个操作 Try,都要注册一个与其对应的确认 Confirm 和补偿 Cancel。TCC 要求应用的每个服务提供 try、confirm、cancel 三个接口,这些完全由业务实现,对业务侵入较大。
- Try 阶段:尝试执行,完成所有业务检查(一致性), 预留必须业务资源(准隔离性)。
- Confirm 阶段:如果所有分支的 Try 都成功了,则走到 Confirm 阶段。Confirm 真正执行业务,不作任何业务检查,只使用Try阶段预留的业务资源。
- Cancel 阶段:取消执行,释放 Try 阶段预留的业务资源。
上图是一个典型的 TCC 分布式事务模型,包括三部分:
- 主业务程序:负责发起并完成整个业务活动,在图中由它向 TM 注册 TCC 事务并开启分布式事务,执行业务。
- 分支服务:整个业务活动的参与方,实现 Try、Confirm 和 Cancel 动作,供主业务程序调用。对应图中的微服务 A 和微服务 B,执行 Try 执行,并根据 TM 返回的结果执行 Confirm 或 Cancel。
- 事务管理器:管理整个业务活动,包括记录事务状态,调用分支服务的 Confirm/Cancel 操作。
TCC特点如下:
- 并发度较高,无长期资源锁定。
- 开发量较大,需要提供 Try/Confirm/Cancel 接口。
- 一致性较好,不会发生 SAGA 已扣款最后又转账失败的情况。
- TCC 适用于订单类业务,对中间状态有约束的业务。
XA
XA 规范主要定义了(全局)事务管理器(TM)和(局部)资源管理器(RM)之间的接口。本地的数据库如 MySQL 在 XA 中扮演的是RM角色。
XA一共分为两阶段:
- 第一阶段(prepare):即所有的参与者 RM 准备执行事务并锁住需要的资源。参与者 ready 时,向 TM 报告已准备就绪。
- **第二阶段 (commit / rollback)**:当事务管理者 TM 确认所有参与者 RM 都 ready 后,向所有参与者发送 commit 命令。
如果有一阶段 prepare 操作失败,那么会调用各子事务的 XA rollback,进行回滚,最后事务成功回滚。
XA事务的特点是:
- 简单易理解,开发较容易
- 对资源进行了长时间的锁定,并发度低
本地消息表
本地消息表,设计核心是将需要分布式处理的任务通过消息的方式来异步确保执行。
本地消息表的特点:
- 不支持回滚。
- 轮询生产消息难实现,如果定时轮询会延长事务总时长,如果订阅 binlog 则开发维护困难。
适用于可异步执行的业务,且后续操作无需回滚的业务
DTM
DTM是一款开源的分布式事务管理器,解决跨数据库、跨服务、跨语言栈更新数据的一致性问题。通俗一点说,DTM提供跨服务事务能力,一组服务要么全部成功,要么全部回滚,避免只更新了一部分数据产生的一致性问题。