1 背景
在讲述分布式事务的概念之前,我们先来回顾下事务相关的一些概念 。
1.1 事务的基本概念
就是一个程序执行单元,里面的操作要么全部执行成功 , 要么全部执行失败,不允许只成功一半另外一半执行失败的事情发生 。例如一段事务代码做了两次数据库更新操作,那么这两次数据库操作要么全部执行成功,要么全部回滚 。
1.2 事务的基本特性
我们知道事务有 4 个非常重要的特性 , 即我们常说的(ACID) 。
- Atomicity(原子性):一个事务(transaction)中的所有操作,要么全部完成 , 要么全部不完成,不会结束在中间某个环节 。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态 , 就像这个事务从来没有执行过一样 。
- Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏 。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作 。
- Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致 。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable) 。
- Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失
本地事务的时代,如果需要同时操作数据库的多条记录,而这些操作可以放到一个事务中,那么我们可以通过数据库提供的事务机制就可以实现 。
而随着微服务架构的推进,原本一个本地逻辑执行单元,被拆分到了多个独立的微服务中,这些微服务又分别操作了不同的数据库和表 。
比如下个指派个体的运输任务,下运输任务的同时要生成需求、计划、任务,还要去调用询价服务 , 投保服务,那么,一旦产生任何一个服务异常,都会产生事务性的问题 。虽然对于我们现有逻辑来说,可以由运营作废 , 但未来自动化之后呢?
分布式事务是为了解决微服务架构(形式都是分布式系统)中不同节点之间的数据一致性问题 。这个一致性问题本质上解决的也是传统事务需要解决的问题 , 即一个请求在多个微服务调用链中,所有服务的数据处理要么全部成功,要么全部回滚 。当然分布式事务问题的形式可能与传统事务会有比较大的差异,但是问题本质是一致的,都是要求解决数据的一致性问题 。
而分布式事务的实现方式有很多种,最具有代表性的是由 Oracle Tuxedo 系统提出的 XA 分布式事务协议 。XA 协议包括两阶段提交(2PC)和三阶段提交(3PC)两种实现,接下来我们分别来介绍下这两种实现方式的原理 。
3 两阶段提交(2PC)两阶段提交又称 2PC(two-phase commit protocol),2PC 是一个非常经典的强一致、中心化的原子提交协议 。这里所说的中心化是指协议中有两个角色:一个是分布式事务协调者(coordinator)和 N 个参与者(participant) 。
3.1 2PC 运行原理
两阶段提交,顾名思义就是要进行两个阶段的提交:第一阶段 , 准备阶段(投票阶段);第二阶段,提交阶段(执行阶段) 。
3.1.1 准备阶段(Prepare phase)
文章插图
- 分布式事务的发起方,向分布式事务协调者(Coordinator,也可以叫事务管理 TransactionManager)发送请求,
- Coordinator 分别向参与者(Participant)A、参与者(Participant)B 分别发送事务预处理请求 , 称之为 Prepare , 有些资料也叫”Vote Request” 。
- 此时这些参与者节点一般来说就会打开本地数据库事务 , 然后开始执行数据库本地事务 , 每个数据库参与者在本地执行事务并写本地的 Undo/Redo 日志(Undo 日志是记录修改前的数据,用于数据库回滚,Redo 日志是记录修改后的数据,用于提交事务后写入数据文件),但在执行完成后并不会立马提交数据库本地事务,而是先向 Coordinator 进行 “Vote Commit” 的反馈,告知处理结果 。
推荐阅读
- Spring事务超时到底是怎么回事?
- 在Linux服务器上部署容器化的分布式缓存系统
- MySQL 事务死锁问题排查
- 四大事务所是哪四大 会计四大事务所是哪四大
- 数据复制:构建大规模分布式系统的关键组成部分
- 分布式架构和微服务架构的区别
- 分布式锁的三种实现!
- Java与MySQL的并发访问冲突:锁与事务
- 职场求生指南:事务与人际关系,究竟该专攻哪个?
- Spring Boot项目业务代码中使用@Transactional事务失效踩坑点总结