分布式事务解决方案

  •  参与者:事务的执行者,例如每个数据库就是一个事务参与者。
  • 协调者:事务的发起者,访问多个数据库的服务程序,例如 购物服务 shopping-service 就是事务协调者。

XA协议(2PC 3PC)

二阶段提交协议(Two-phase Commit,即 2PC),参与者将操作成败结果通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。

2PC 方案实现起来简单,实际项目中使用比较少,主要因为以下问题:
1.性能问题:所有参与者在事务提交阶段处于同步阻塞状态,占用系统资源,容易导致性能瓶颈。
2.可靠性问题:如果协调者存在单点故障问题,如果协调者出现故障,参与者将一直处于锁定状态。
3.数据一致性问题:在阶段 2 中,如果发生局部网络问题,一部分事务参与者收到了提交消息,另一部分事务参与者没收到提交消息,那么就导致了节点之间数据的不一致。

三阶段提交协议(Three-phase Commit,即 3PC),是二阶段提交协议的改进版本,与二阶段提交不同的是,引入超时机制。三阶段提交将二阶段的准备阶段拆分为 2 个阶段,插入了一个 preCommit 阶段,使得原先在二阶段提交中,参与者在准备之后,由于协调者发生崩溃或错误,而导致参与者处于无法知晓是否提交或者中止的“不确定状态”所产生的可能相当长的延时的问题得以解决。

优点:1.性能提升:降低了阻塞范围,在等待超时后会中断事务。
2.可靠性提升:避免了协调者单点问题,阶段 3 中协调者出现问题时,参与者会继续提交事务。
缺点:依然存在数据不一致问题,阶段 3 中如果协调者请求中断事务,但协调者无法与参与者正常通信时,会导致参与者继续提交事务,造成数据不一致。

TCC协议

TCC(Try-Confirm-Cancel)Try 为一阶段,负责资源的检查和预留。Confirm 为二阶段提交操作,执行真正的业务。Cancel 是预留资源的取消。例如:Try 阶段先将库存冻结并将订单改为待确认状态。

优点:1.性能提升:具体业务来实现控制资源锁的粒度变小,不会锁定整个资源。
2.可靠性提升:解决了 XA 协议的协调者单点故障问题。
3.数据最终一致性:基于 Confirm 和 Cancel 的幂等性,保证事务最终完成确认或者取消,保证数据的一致性。
缺点: TCC 的 Try、Confirm 和 Cancel 操作功能要按具体业务来实现,业务耦合度较高,提高了开发成本。

本地消息表

核心思路是将分布式事务拆分成本地事务进行处理。通过在事务主动发起方额外新建事务消息表,事务发起方处理业务和记录事务消息在本地事务中完成,轮询事务消息表的数据发送事务消息,事务被动方基于消息中间件消费事务消息表中的事务。

优点:从应用设计开发的角度实现了消息数据的可靠性,方案轻量,容易实现。
缺点:与具体的业务场景绑定,耦合性强,不可公用。消息数据与业务数据同库,占用业务系统资源。消息服务性能会受到关系型数据库并发性能的局限。

MQ事务消息

基于 MQ 的分布式事务方案其实是对本地消息表的封装,将本地消息表基于 MQ 内部,其他方面的协议基本与本地消息表一致。

优点:消息数据独立存储 ,降低业务系统与消息系统之间的耦合。吞吐量大。
缺点:一次消息发送需要两次网络请求(half 消息 + commit/rollback 消息) 。业务处理服务需要实现消息状态回查接口。

Saga协议

Saga 事务核心思想是将长事务拆分为多个本地短事务,由 Saga 事务协调器协调,如果正常结束那就正常完成,如果某个步骤失败,则根据相反顺序一次调用补偿操作。

每个 Saga 事务由一系列幂等的有序子事务(sub-transaction) Ti 组成。每个 Ti 都有对应的幂等补偿动作 Ci,补偿动作用于撤销 Ti 造成的结果。和 TCC 相比,Saga 没有“预留”动作,它的 Ti 就是直接提交到库。

Seata

Seata分布式事务框架,Seata 为用户提供了 AT、XA、TCC、SAGA 事务模式。

其中 AT 模式是 Seata 主推的事务模式。Seata 的 AT 模式建立在关系型数据库的本地事务特性的基础之上,通过数据源代理类拦截并解析数据库执行的 SQL,记录自定义的回滚日志,如需回滚,则重放这些自定义的回滚日志即可。AT 模式虽然是根据 XA 事务模型(2PC)演进而来的,但是 AT 打破了 XA 协议的阻塞性制约,在一致性和性能上取得了平衡。

AT 模式的两个阶段是:
第一阶段:首先获取本地锁,执行本地事务,业务数据操作和记录回滚日志在同一个本地事务中提交,最后释放本地锁;
第二阶段:如需全局提交,异步删除回滚日志即可,这个过程很快就能完成。如需要回滚,则通过第一阶段的回滚日志进行反向补偿。

推荐阅读

1.4 w字,25 张图让你彻底掌握分布式事务原理_公众号:码海的博客-CSDN博客

还不理解“分布式事务”?这篇给你讲清楚! - 脉脉

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值