分布式事务如何解决?

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

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

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

首先理解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版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
网络协议 网络安全 网络虚拟化
路由器详细讲解
路由器是连接不同网络并转发数据包的关键设备,工作在OSI模型第三层(网络层)。它通过路由表选择最佳路径,支持数据转发、NAT转换、防火墙保护等功能。路由器分为家用、商用和工业级,各有针对性的性能与功能。其配置包括硬件连接、登录管理界面及网络、无线、安全等设置,选购时需关注处理能力、无线速率、端口速率和功能需求等关键指标。
1876 22
|
Shell 开发工具 git
Shell别名的使用方法及管理技巧
Shell别名的使用方法及管理技巧
417 0
|
Shell Linux Windows
【Linux】进程理解与学习Ⅰ-进程概念
【Linux】进程理解与学习Ⅰ-进程概念
294 0
|
网络协议 网络安全 数据安全/隐私保护
PuTTY
安装PuTTY远程连接esc
|
存储 数据库 Android开发
|
Java
MyEclipse JSP页面中文字符不能保存
问题: 就是写HTML+JSP代码时有些中文,保存时提示sava could not be completed. Reason: some characters cannot be mapped using "ISO-8859-1" character encoding.
943 0
|
Linux
centos 5.5 中文显示和中文输入法
一.安装中文支持 方法1。在安装光盘中找到一下包进行安装. rpm -ivh fonts-chinese-3.
1091 0
|
8天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
7394 12
|
6天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
1550 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
7天前
|
人工智能 并行计算 PyTorch
秋叶 ComfyUI 2026 整合包 v3.2 完整部署教程:Python 3.13 + Torch 2.13 全栈升级
秋叶aaaki ComfyUI 2026年8月整合包v3.2正式发布!全面升级Python 3.13.11、PyTorch 2.13.0+cu130及ComfyUI v0.30.2,原生支持MiniMax H3、Wan 2.2、Qwen-Image-2.1等2026主流音视频/图像模型,解压即用,无需环境配置。
1017 8

热门文章

最新文章