分布式事务如何解决?

简介: 分布式事务如何解决?

分布式事务的由来,当两个系统一个负责扣款 ,一个负责发货,但是扣款的系统出现异常,扣款失败,货还在正常发送,这时候分布式事务就出现了。

简单来说,就是一次大的操作都由小的操作来组成,这些小的操作部署在不同服务器上,且属于不同的应用,分布式事务保证这些操作要么全部成功,要么全部失败。

首先理解cap定律:可用性,一致性,分区容错率。因为三者不可以同时满足,于是就出现了base理论,base意思是保证分区容错率和可用性,来用最终一致性来解决一致性问题。

当我们A系统数据修改成功,传递给B系统的时候,出现异常,这时候B系统还是之前的数据,于是就导致了一致性失效,只保证了可用性和分区容错率。

那么我们这时候如何保证一致性呢,就需要牺牲分区容错率,当发生异常的时候进行事务的回滚,这种业务场景在数据库需要保证高一致性的情况下使用很多,双11这种场景就会牺牲分区容错率保证数据一致性。

分布式解决方案?

一、2PC两阶段提交方案/XA方案

一个系统担任协调器角色,其他系统担任参与者,主要分为conmmit-request阶段和commit。

请求阶段:协调者向所有参与者发起准备提交请求,然后收集。

提交阶段:如果全都是ok,则会提交请求,否则进行回滚或者取消提交请求。

方案缺陷:

同步阻塞:所有参与者都是事务同步阻塞,当参与者占有公共资源,其他访问节点访问时候则不得不阻塞。

无法高可用:单点故障,一旦协调者出问题,系统则不可用。

数据不一致:当参与者有的没接收到消息,处于阻塞,这段时间则不一致。

不确定性:当协调者发送commit,这时候只有一个参与者受到新消息,当参与者与协调者宕机时候,新选举的协调者无法判断是否已提交消息。

XA解决方案可以用springBoot+atomikos+jta来实现分布式事务处理。

3pc对于协调者和参与者都设置了超时时间,而2pc只有协调者才有超时机制。避免了参与者长时间未收到commit消息,无法释放资源问题,参与者长时间未收到commit会自动进行本地commit进而释放资源。另外canCommit、preCommit、doCommit是哪个阶段的设计,保证了参与节点各个状态一致。

TCC方案
Tcc方案分为try confirm cancel三个阶段。

Try(尝试待执行的任务):并没有真实执行,检查所有业务需要的资源,并预留。

Confirm(执行业务):直接执行业务,因为之前有预留资源,直接使用。

Cancel(回滚):业务执行失败,则会释放所有资源,并回滚已操作数据。

try阶段:

比如商品系统用户点击购买商品,

订单数据库这时候改为‘下单中’。
账户金额数据库金额扣减,冻结资金10,剩余90.
库存系统数据库 库存扣减,冻结1.

Confirm阶段:

订单数据库这时候改为‘下单成功’。
账户金额冻结金额扣减成功,剩余90.
库存数据库扣减成功。

Cancel阶段:

订单数据库更新为‘下单失败’。
金额还原成100,状态支付失败。
库存还原成100,下单失败。

TCC方案适合强一致性,适合金钱相关的,因此需要大量业务处理补偿代码,提供补偿机制。有开源的TCC框架,TCC-transaction。

本地消息表
A系统首先写入业务表,然后写入消息表,将消息通过mq发送给B系统。
B系统首先写入消息表,可以通过主键唯一性保证不会重复消费,之后再写入业务表,当业务执行成功,再发送消息到mq。
A系统这时候就会监听到B系统是否成功,再根据B系统的mq消息来决定是否回滚。

最大努力通知方案
使用于一些最终一致性低的业务,入银行和商户通知等。

A系统在本地事务完成之后,通过mq不断通知b系统去发送消息给用户,如果ok则成功,不ok则重试几次进入死信队列或者补偿机制。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
消息中间件 数据库 RocketMQ
分布式事务常见解决方案
分布式事务常见解决方案
417 0
|
3月前
|
关系型数据库 MySQL
常见分布式事务的解决方案(一)
常见分布式事务的解决方案(一)
|
22天前
Seata框架在AT模式下是如何保证数据一致性的?
通过以上这些机制的协同作用,Seata 在 AT 模式下能够有效地保证数据的一致性,确保分布式事务的可靠执行。你还可以进一步深入研究 Seata 的具体实现细节,以更好地理解其数据一致性保障的原理。
36 3
|
3月前
|
消息中间件 中间件 关系型数据库
常用的分布式事务解决方案(四)
常用的分布式事务解决方案(四)
|
6月前
|
运维 程序员 数据库
如何用TCC方案轻松实现分布式事务一致性
TCC(Try-Confirm-Cancel)是一种分布式事务解决方案,将事务拆分为尝试、确认和取消三步,确保在分布式系统中实现操作的原子性。它旨在处理分布式环境中的数据一致性问题,通过预检查和资源预留来降低失败风险。TCC方案具有高可靠性和灵活性,但也增加了系统复杂性并可能导致性能影响。它需要为每个服务实现Try、Confirm和Cancel接口,并在回滚时确保资源正确释放。虽然有挑战,TCC在复杂的分布式系统中仍被广泛应用。
294 5
|
7月前
|
算法 微服务
分布式事务解决方案
分布式事务解决方案
57 0
|
数据库连接 数据库
分布式事务及解决方案
简单了解下什么是事务?用户定义的一系列数据库操作,这些操作可以视为一个完整的逻辑处理单元,要么全部执行,要么全部不执行。为保障事务是正确可靠的,事务具备4个特性:
109 0
|
SQL Oracle NoSQL
分布式事务几种方案
分布式事务几种方案
|
消息中间件 Java 关系型数据库
分布式事务几种解决方案
本文小马参考部分文章,对分布式事务自己做了一下消化和总结整理。
296 1
分布式事务几种解决方案
下一篇
DataWorks