分布式事务在分布式系统非常重要,也是大厂重点考察对象,下面重点详解4大分布式事务解决方案@mikechen
什么是分布式事务
分布式事务:是指涉及多个独立节点、或服务的事务操作。
如下图所示:
在这些节点中的每一个可能在不同的:计算机、进程、或容器中运行。
因此需要特殊的处理机制来确保事务的一致性、隔离性、持久性和原子性,这就是“分布式事务”。
分布式事务解决方案
分布式事务的常见方法包括:两阶段提交(Two-Phase Commit,2PC)、补偿事务(Compensating Transaction)、Saga模式、本地消息表(Local Message Table)等。
两阶段提交协议
两阶段提交协议(Two-Phase Commit,2PC)是一种分布式事务协议,用于确保多个参与者在分布式环境中的事务操作要么全部提交,要么全部回滚。
该协议涉及一个事务协调者(Coordinator)、和多个事务参与者(Participants)。
如下图所示:
两阶段提交协议的主要作用:是保证分布式系统中的事务操作的一致性。
通过协调者和参与者之间的通信和协调,确保所有参与者在事务提交之前都已准备好,并且在所有参与者都同意提交的情况下才提交事务,从而避免数据不一致的情况发生。
两阶段提交协议的工作原理分为两个阶段:准备阶段(Prepare Phase)和提交阶段(Commit Phase)。
1、准备阶段:
协调者向所有参与者发送准备请求(Prepare Request),询问它们是否可以提交事务。
参与者接收到准备请求后,进行本地事务的准备操作,检查资源和执行操作是否可以顺利完成。
2、提交阶段:
协调者收到所有参与者的准备响应后,根据收到的响应决定是否提交事务。
如果所有参与者都发送了准备成功响应,协调者向所有参与者发送提交请求(Commit Request),要求它们提交事务。
如果协调者在准备阶段发送准备,请求后发生故障或超时未响应,则参与者可以根据本地超时机制执行回滚操作,从而避免长时间等待导致资源占用。
主要问题:
两阶段提交协议的缺点:是在提交阶段存在阻塞问题、和单点故障问题。
由于协调者在提交阶段需要等待所有参与者的响应,因此如果有一个参与者无法响应或出现故障,协调者将一直处于等待状态,从而导致整个事务的阻塞。
此外,由于协调者是单点,如果协调者发生故障,则整个协议无法继续进行,从而导致事务无法提交、或回滚。
三阶段提交协议
三阶段提交协议(Three-Phase Commit,3PC)是一种分布式事务协议,是对两阶段提交协议的改进。
它通过引入一个预提交阶段(Pre-Commit Phase),来解决两阶段提交协议中的阻塞、和单点故障问题。
如下图所示:
分为三个阶段:
准备阶段:
协调者向所有参与者发送准备请求(Prepare Request),询问它们是否可以提交事务。
预提交阶段:
协调者收到所有参与者的准备响应后,如果所有参与者都准备好提交事务,则向所有参与者发送预提交请求(Pre-Commit Request)。
提交阶段:
协调者收到所有参与者的预提交响应后,如果所有参与者都成功预提交事务,则向所有参与者发送提交请求(Commit Request)。
通过引入预提交阶段,三阶段提交协议可以在第一阶段和第二阶段之间引入一个短暂的等待期,从而避免了两阶段提交协议中的阻塞问题。
补偿事务
补偿事务是一种用于处理分布式事务失败的技术,当一个事务无法成功完成时,补偿事务会执行一系列操作,将系统恢复到一个已知的良好状态。
补偿事务的原理是通过设计一个与主事务相反的操作序列,使得在主事务失败时,可以通过执行补偿事务来恢复系统的状态。
TCC补偿事务的工作原理,如下图所示:
- 尝试阶段(Try):
- 在尝试阶段,事务参与者尝试执行业务逻辑,并预留必要的资源(如锁、资源等);
- 尝试阶段不会立即对数据进行提交,而是将尝试的结果保存在临时表或者预留资源中,并等待确认阶段的执行。
- 确认阶段(Confirm):
- 在确认阶段,事务参与者确认执行尝试阶段中的业务逻辑,并提交相关的操作;
- 如果确认阶段成功提交,事务参与者就释放之前预留的资源。
- 取消阶段(Cancel):
- 在取消阶段,如果事务在确认阶段发生失败或异常,事务参与者需要执行取消操作,将之前尝试阶段中的操作进行回滚或者撤销;
- 取消操作通常是补偿性的操作,它可以撤销或者部分撤销尝试阶段中的操作,从而恢复系统到一个一致的状态。
TCC补偿事务的优点在于它将事务操作拆分为三个阶段,并在每个阶段都提供了相应的补偿逻辑,从而能够更好地处理分布式系统中的事务失败、或异常。
然而,TCC模式也存在一些缺点,如实现复杂度高、资源占用多等问题,因此在设计和实现时需要谨慎考虑。
消息队列一致性
本地消息是一种用于实现最终一致性的技术,它通过将消息和事务状态,保存在本地数据库中来确保事务的一致性。
如下图所示:
在分布式系统中,当一个服务需要向其他服务发送消息时,它将消息保存在本地数据库的消息表中,并在同一事务中更新事务状态。
如果事务成功提交后,服务将消息发送到消息队列。
如果事务失败,服务可以通过重新执行消息来恢复事务状态,从而维护系统的一致性。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注作者「mikechen」公众号,获取更多技术干货!

后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》