分布式事务快速入门

分布式事务基本概念

使用分布式事务的场景:分布式场景下的跨数据库事务

分布式事务诞生的理论:CAP和Base

3种一致性:

强一致性 :系统写入了什么,读出来的就是什么。

弱一致性 :不一定可以读取到最新写入的值,也不保证多少时间之后读取到的数据是最新的,只是会尽量保证某个时刻达到数据一致的状态。

最终一致性 :弱一致性的升级版。系统会保证在一定时间内达到数据一致的状态

其他一致性:

读写一致性:是一种在分布式系统中保证读取操作与写入操作之间一致性的模型

柔性事务(最终一致性):TCC、 Saga、MQ 事务 、本地消息表补偿

刚性事务(强一致性):2PC,3PC

刚性事务是基于数据库层面保证事务的强一致性的,柔性事务是基于外部中间件或者代码保证事务的最终一致性的

业务代码侵入方案:TCC,Saga

业务代码无侵入方案:2PC,3PC

XA规范的角色:

Application Program :AP,应用程序本身

Resource Manager : RM,资源管理器,指的是数据库

Transational Manager :TM,事务管理器


2PC-两阶段提交

2PC的执行流程:

分为准备阶段和提交阶段

准备阶段:询问RM是否能执行事务,如果能执行事务就直接做预处理,例如Mysql的预处理就是写入Undo日志和Redo日志,但是不写入Binlog日志,因为此时事务还没提交

提交阶段:查看所有的RM是否预处理成功(全部RM属于就绪状态),如果全部成功就提交,如果有一个失败了就回滚

2PC的优缺点:

优点:

  1. 简单
  2. 数据强一致性

缺点:

  1. 同步阻塞,要等待所有事务都就绪再提交
  2. 部分数据不一致情况,commit和rollback不能保证所有节点同时成功
  3. 没有超时机制,TM挂掉后多个RM的事务会一直等待提交

3PC-三阶段提交

3PC的执行流程:

准备阶段,预提交阶段,提交阶段

准备阶段:询问RM是否能执行事务,超时或者RM说不能执行事务就中断事务

预提交阶段:再一次询问RM是否能执行事务,如果可以就进入预提交(写入Undo日志和Redo日志),如果No或者超时就回滚

提交阶段:所有RM都预处理成功,则提交事务。有一个RM失败或者超时了,则回滚

2PC对比3PC:

  1. 3PC是多次判断数据库状态(多了一次判断),加入了新的协议,同时增加了通信的开销
  2. 3PC引入的RM超时机制是多次一举的,其实2PC就够了,2PC的RM一直等待的情况其实是理论而已,实际Mysql等数据库本身就有事务超时机制
  3. 2PC实现更加简单
  4. 3PC不仅没有完全解决阻塞问题还会导致性能更糟糕,多数应用会选择通过复制状态机解决 2PC 的阻塞问题

TCC补偿事务

TCC的执行流程:

Try,Confirm,Cancel

执行流程:Try,Try成功就Confirm,失败就Cancel

TCC会将日志记录,实战中会实现Confirm失败和Cancel失败的情况,会进行重试,如果重试多次失败要走人工补偿

TCC和2PC的区别:

  1. TCC是基于代码自定义逻辑来补偿保证最终一致性,2PC是基于Mysql事务保证强一致性
  2. TCC的Try是类似于冻结,例如500元转账100元是冻结这个100元而不是真的转账。而2PC是给这500元的记录上记录锁
  3. 业务补偿逻辑的区别,TCC不是基于数据库的通用事务机制,而是根据具体业务的流程和规则编写的代码

TCC和2PC,3PC的区别:

  1. 2PC/3PC 依靠数据库或者存储资源层面的事务,TCC 主要通过修改业务代码来实现。
  2. 2PC/3PC 属于业务代码无侵入的,TCC 对业务代码有侵入。
  3. 2PC/3PC 追求的是强一致性,在两阶段提交的整个过程中,一直会持有数据库的锁。TCC 追求的是最终一致性不会一直持有各个业务资源的锁

MQ事务

RocketMQ和Kafka都提供了事务的相关功能

可以将生产消息,消费,处理整个过程变成一个原子性的操作


Saga事务

长事务分为多个短事务,然后短事务分别按顺序提交,有一个短事务失败就回滚

失败的补偿逻辑还是要通过业务代码补偿

正向补偿的执行顺序(失败回滚):T1,T2,…,Ti(失败),Ci(补偿),…,C2,C1

反向补偿的执行顺序(失败重试):T1,T2,…,Ti(失败),Ti(重试)…,Ti+1,…,Tn。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/904956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nvme Unable to change power state from D3cold to D0, device inaccessible

有个thinkpad l15 gen4笔记本,使用较少,有一块三星m2和东芝14t硬盘,想安装飞牛nas系统作为家庭照片库,制作飞牛启动盘,发现安装飞牛需要全盘格式化,电脑本身的系统还是需要保留的,故想到再安装一…

Unity Shaders and Effets Cookbook

目录 作者简介 审稿人简介 前言 我是偏偏 Unity Shaders and Effets Cookbook 第一章:Diffuse Shading - 漫反射着色器 第二章:Using Textures for Effects - 着色器纹理特效的应用 第三章:Making Your Game Shine with Specular - 镜…

部署RocketMQ

部署环境:jdk8以上,Linux系统 下载和安装指令: wget https://archive.apache.org/dist/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip 显示下载成功: --2025-05-10 11:34:46-- https://archive.apache.org/dist/rocketm…

使用FastAPI和React以及MongoDB构建全栈Web应用04 MongoDB快速入门

一、NoSQL 概述 1.1 了解关系数据库的局限性 Before diving into NoSQL, it’s essential to understand the challenges posed by traditional Relational Database Management Systems (RDBMS). While RDBMS have been the cornerstone of data management for decades, th…

高精度之加减乘除之多解总结(加与减篇)

开篇总述:精度计算的教学比较杂乱,无系统的学习,且存在同法多线的方式进行同一种运算,所以我写此篇的目的只是为了直指本质,不走教科书方式,步骤冗杂。 一,加法 我在此讲两种方法: …

气象大模型光伏功率预测中的应用:从短期,超短期,中长期的实现与开源代码详解

1. 引言 光伏功率预测对于电力系统调度、能源管理和电网稳定性至关重要。随着深度学习技术的发展,大模型(如Transformer、LSTM等)在时间序列预测领域展现出强大能力。本文将详细介绍基于大模型的光伏功率预测方法,涵盖短期(1-6小时)、超短期(15分钟-1小时)和中长期(1天-1周…

玩转Docker(一):基本概念

容器技术是继大数据和云计算之后又一炙手可热的技术,而且未来相当一段时间内都会非常流行。 本文将对其基本概念和基本使用做出介绍。包括容器生态系统、容器的原理、怎样运行第一个容器、容器技术的概念与实践、Docker镜像等等 目录 一. 鸟瞰容器生态系统 1. 容器…

计算机视觉与深度学习 | 基于数字图像处理的裂缝检测与识别系统(matlab代码)

🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅 基于数字图像处理的裂缝检测与识别系统 🥦🥦🥦🥦🥦🥦🥦🥦🥦🥦🥦🥦🥦**系统架构设计****1. 图像预处理**目标:消除噪声+增强裂缝特征**2. 图像分割**目标:提取裂缝区域**3. 特征…

推荐一款免费开源工程项目管理系统软件,根据工程项目全过程管理流程开发的OA 办公系统

在当今的工程项目管理领域,许多企业和团队面临着诸多难题。传统的管理方式往往依赖于人工记录和分散的工具,导致项目进度难以实时把控,任务分配不够清晰,合同管理混乱,事件提醒不及时,财务管理缺乏系统性&a…

Proser:在使用中改进

上位机接收到下位机发送的协议,解析出工作模式,然后依据此模式切换到相应的界面。为了调试这个功能,由Proser提供的Block与Sequence生成器相当有用: 使用Block生成器:忽略掉不感兴趣的数据使用Sequence生成器&#xf…

C语言_程序的段

在 C 语言程序中,内存通常被分为多个逻辑段,每个段存储不同类型的数据。理解这些段的结构和功能,有助于你更高效地编写、调试和优化程序。以下是 C 语言程序中主要的内存段及其特点: 1. 代码段(Text Segment) 存储内容:编译后的机器指令(程序代码)。特性: 只读:防止…

【桌面】【输入法】常见问题汇总

目录 一、麒麟桌面系统输入法概述 1、输入法介绍 2、输入法相关组件与服务 3、输入法调试相关命令 3.1、输入法诊断命令 3.2、输入法配置重新加载命令 3.3、启动fcitx输入法 3.4、查看输入法有哪些版本,并安装指定版本 3.5、重启输入法 3.6、查看fcitx进程…

Node.js 24.0 正式发布:性能跃升与开发体验全面升级

Node.js v24.0.0 震撼发布!V8 13.6、npm 11、权限模型稳定化等重磅更新 2025年5月6日 —— Node.js 社区迎来重大里程碑!Node.js v24.0.0 正式发布,带来一系列激动人心的新特性、性能优化和 API 改进。本次更新涵盖 V8 JavaScript 引擎升级至…

MySQL 查询优化全攻略:从原理到实战

为什么查询优化如此重要? 在当今数据驱动的时代,数据库性能直接影响着用户体验和业务效率。根据统计,网页加载时间每增加1秒,转化率可能下降7%,而数据库查询往往是性能瓶颈的关键所在。作为最流行的开源关系型数据库之…

《从零开始:构建你的第一个区块链应用》

一、引言 区块链技术,这个曾经只在金融领域被广泛讨论的技术,如今已经渗透到各个行业。从供应链管理到智能合约,区块链的应用场景越来越丰富。对于开发者来说,理解区块链的基本原理并构建一个简单的区块链应用,是进入这…

使用AES-CBC + HMAC-SHA256实现前后端请求安全验证

AES-CBC HMAC-SHA256 加密验证方案,下面是该方案二等 优点 与 缺点 表格,适用于文档、评审或技术选型说明。 ✅ 优点表格:AES-CBC HMAC-SHA256 加密验证方案 类别优点说明🔐 安全性使用 AES-CBC 对称加密使用 AES-128-CBC 是可…

Veins同时打开SUMO和OMNeT++的GUI界面

进入 Veins 工程目录(即包含 sumo-launchd.py 的目录),打开终端设置 SUMO_HOME 环境变量(指向你安装的 SUMO 路径): export SUMO\_HOME/home/veins/src/sumo-1.11.0编译 Veins 工程(包含 OMNeT…

suricata之日志截断

一、背景 在suricata的调试过程中,使用SCLogXXX api进行信息的输出,发现输出的日志被截断了,最开始以为是解析逻辑有问题,没有解析完整,经过排查后,发现SCLogXXX api内部进行了长度限制,最长2K…

navicat 如何导出数据库表 的这些信息 字段名 类型 描述

navicat 如何导出数据库表 的这些信息 字段名 类型 描述 数据库名字 springbootmt74k 表名字 address SELECT COLUMN_NAME AS 字段名,COLUMN_TYPE AS 类型,COLUMN_COMMENT AS 描述 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA springbootmt74k AND TABLE_NAME a…

LVGL图像导入和解码

LVGL版本:8.1 概述 在LVGL中,可以导入多种不同类型的图像: 经转换器生成的C语言数组,适用于页面中不常改变的固定图像。存储系统中的外部图像,比较灵活,可以通过插卡或从网络中获取,但需要配置…