发布时间:2023-02-09 文章分类:编程知识 投稿人:王小丽 字号: 默认 | | 超大 打印

分布式事务

什么是分布式事务?

事务提供了一种机制,将包含一系列操作的工作序列纳入到一个不可分割的执行单元,只有所有操作都被正确执行才能提交事务,任意一个操作失败都会导致整个事务回滚到之前状态。

简单的说,事务提供了一种机制,使得工作要么全部都不做,要么全部被执行,即all or nothing。

分布式事务,就是在分布式系统中运行的事务,由多个本地事务组合而成,在分布式场景下,对事务的处理操作可能来自不同的机器,甚至是来自不同的操作系统。

什么是ACID?

ACID是事务具有的四大基本特征:

什么是BASE理论?

ACID中的C是强一致性,也就是说所有操作都执行成功才能提交最终结果,以保证数据一致性或完整性。随着分布式系统规模不断扩大,复杂度急剧上升,达成强一致所需时间周期较长,限定了复杂业务的处理。

为了解决这一挑战,提出了BASE理论,关键点在于采用最终一致性来取代强一致性:

ACID和BASE是对一致性和可用性的不同权衡所产生的不同结果,但二者都保证了数据的持久性。ACID选择了强一致性而放弃了系统的可用性,BASE理论则保证了系统的可用性,允许数据在一段时间内可以不一致,最终达到一致状态即可。

什么是刚性事务和柔性事务?

如何实现分布式事务?

常用的分布式事务有3种基本方法:

基于XA协议的二阶段提交方法

基于XA协议的二阶段提交方法中,二阶段提交协议(Two-phase Commit Protocol,2PC)是用于保证分布式系统中事务提交时的数据一致性,是XA在全局事务中用于协调多个资源的机制。

它引入了一个协调者来管理所有的节点,并确保这些节点正确提交操作结果,如果提交失败则放弃事务。

二阶段提交协议的执行过程分为投票(Voting)和提交(Commit)两个阶段:

二阶段提交的算法思路可以概括为:协调者向参与者下发请求事务操作,参与者接收到请求后,进行相关操作并将操作结果通知协同者,协同者根据所有参与者的反馈结果决定各参与者是要提交操作还是撤销操作。

基于XA的二阶段提交算法存在的问题:

三阶段提交方法

三阶段提交协议(Three-phase Commit Protocol,3PC)是对二阶段提交(2PC)的改进,它引入了超时机制和准备阶段。

三阶段提交协议有CanCommit、PreCommit和DoCommit三个阶段:

3PC协议在协调者和参与者都引入了超时机制,当参与者在预提交阶段向协调者发送ACK消息后,如果长时间没有得到协调者的响应,在默认情况下,参与者会自动降超时事务进行提交,从而减少整个集群的阻塞时间。

三阶段提交仍然会存在数据不一致的情况。

基于分布式消息的最终一致性方案

2PC和3PC的核心思想都是以集中式的方式实现分布式事务,它有两个缺点:

我们解决一致性问题的核心思想:将需要分布式处理的事务通过消息或者日志的方式异步执行,消息或日志可以存到本地文件、数据库或者消息队列中,再通过业务规则进行失败重试。

基于分布式消息的最终一致性方案的事务处理,引入了一个消息中间件,用于在多个应用之间进行消息传递。

这种方案采用消息传递机制,并使用异步通信的方式,避免了通信阻塞,从而增加系统的吞吐量,同时它还可以屏蔽不同系统的协议规范,使其可以直接交互。

在不需要请求立即返回结果的场景下,这些特性就带来了明显的通信优势,并且通过引入消息中间件,实现了消息生成方本地事务和消息发送的原子性,采用最终一致性方式,只需保证数据最终一致即可,一定程度上解决了2PC和3PC因为强一致性而在某些情况下导致数据不一致的问题。

针对上述三种不同的分布式事务方法,详细的比较如下表所示。
《分布式技术原理与算法解析》学习笔记Day06