分布式事务之2PC、3PC、TCC

本文介绍了分布式事务中的2PC、3PC和TCC三种协议。2PC分为准备和提交两个阶段,但在某些情况下可能导致数据不一致。3PC在2PC基础上增加了一个CanCommit阶段,提高了可用性。TCC则要求每个分支事务实现Try、Confirm、Cancel三个操作,对业务侵入性强,但允许更细粒度的数据操作控制。

目录

什么是2PC

关系型数据库的2PC=>XA方案

分布式事务框架Seata的2PC=》AT方案

Seata的2PC和传统2PC比较

2PC的问题

什么是3PC

什么是TCC


 

什么是2PC

 

2PC即两阶段提交协议,将整个事务流程分为两个阶段:准备阶段、提交阶段。

简单来说准备阶段就执行事务代码,但不一定提交,提交阶段决定是最终提交事务还是回滚事务。

为什么要简单来说?因为基于数据库的2PC和分布式框架Seata的2PC有差异,不能一概而论。

 

 

关系型数据库的2PC=>XA方案

 

数据库的2PC也叫传统2PC,是2PC在数据库层面的实现,也叫做XA方案。

XA方案由三部分组成:应用程序、事务管理器和参与者。 具体的事务执行过程如下

准备阶段(Prepare phase):

事务管理器给每个参与者发送Prepare消息,每个数据库参与者在本地执行事务,并写本地Undo/Redo日志,此时事务没有提交

提交阶段(Commit pha

### 分布式事务的概念 分布式事务是指在一个分布式系统中,为了保证跨多个节点的数据一致性而设计的一种机制。它涉及多个独立的服务或模块之间的协调工作,这些服务可能运行在不同的物理机器上或者不同的进程中。 #### 两阶段提交 (2PC) 两阶段提交是一种强一致性的协议,用于确保所有参与的节点都能成功完成它们的操作。其过程分为两个阶段: 1. **准备阶段**: 协调者询问参与者是否准备好提交事务。每个参与者会尝试执行所需的操作并锁定资源,但不会真正提交更改。如果一切正常,参与者回复“同意”,否则回复“取消”。 2. **提交阶段**: 如果所有的参与者都返回了“同意”的响应,那么协调者发送“提交”消息给所有参与者,此时参与者正式提交他们的操作并释放锁。如果有任何一个参与者不同意,则整个事务被回滚。这种方法虽然能保证数据的一致性,但在高并发环境下性能较差,并且容易造成单点故障[^4]。 ```java public class TwoPhaseCommit { public void prepare() throws Exception { /*...*/ } public void commit() throws Exception { /*...*/ } public void rollback() throws Exception { /*...*/ } } ``` #### 三阶段提交 (3PC) 作为对传统二阶段提交改进版本之一的是三阶段提交协议。该方法试图减少阻塞时间并通过引入超时机制来提高系统的可用性和可靠性。具体来,它增加了一个额外的状态——预投票(pre-vote),从而允许某些情况下即使部分成员未及时回应也能继续推进流程。 - 预备阶段:类似于2PC的第一步; - 提交请求阶段:当预备状态完成后,领导者发出实际提交指令前先确认是否有足够的票数支持此次交易; - 实际提交/终止阶段:依据前面收集的信息决定最终动作是提交还是撤销。 相比起标准版TPC, 这种做法理论上降低了死锁风险同时也增强了容错能力不过代价就是复杂度上升不少而且依旧难以完全摆脱网络分区带来的影响. #### TCC 补偿事务 TCC 是 Try Confirm Cancel 的缩写形式代表了一类轻量级解决方案适用于那些不需要严格ACID特性的应用场景下。在这种模型里面开发者自行定义三个主要的动作函数分别对应着试探性预留资源(Try), 正式占用资源(Confirm) 及清理之前所做的准备工作(Cancel)[^2]: - `Try` 方法负责检查必要的条件并且做初步预定; - `Confirm` 则是在确定无误之后才去落实真正的改变; - 而一旦出现问题则依靠 `Cancel` 来撤消先前的一切努力恢复原状; 值得注意的是这里并没有强制要求数据库本身具备完整的事务特性因此非常适合用来处理一些异构环境下的协同作业需求另外由于全部逻辑均由程序员手动编码实现故灵活性极高但是同样也意味着更高的维护难度和技术门槛. ```python class TccTransaction: def try_action(self): pass def confirm_action(self): pass def cancel_action(self): pass def execute_tcc(transaction): transaction.try_action() if success: transaction.confirm_action() else: transaction.cancel_action() ``` #### LCN 全局事务管理器 LCN(Lightweight Cloud Native)是由阿里巴巴开源出来专门针对云原生架构特点优化过的另一种新型分布式事务框架。它的核心理念在于利用中心化的控制器统一调度分散各地的小型局部单元共同构建出一套更大范围内的整体视图进而达成全局范围内的一致效果[^3]. 在这个体系结构当中每一个具体的业务环节都被封装成为单独的任务实例交给特定的工作线程池去异步执行与此同时主控端持续跟踪监控各个子任务的实际进展情况直到最后要么全体顺利完成要么果断采取补救措施防止错误扩散蔓延开来破坏其他健康组件的功能表现. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值