当前位置: 首页 > article >正文

【数据库事务、消息队列事务、Redis 事务、Spring 事务 详细分析】

数据库事务、消息队列事务、Redis 事务、Spring 事务** 的详细分析

在分布式系统和应用开发中,事务管理是确保数据一致性和可靠性的关键机制。以下是针对 数据库事务、消息队列事务、Redis 事务、Spring 事务 的详细分析,包括原理、特点、适用场景和对比总结。


1. 数据库事务

原理
数据库事务基于 ACID 特性(原子性、一致性、隔离性、持久性),通过事务日志(如 Redo Log、Undo Log)和锁机制实现。
核心操作

  • BEGIN:开始事务
  • COMMIT:提交事务
  • ROLLBACK:回滚事务

隔离级别

  • 读未提交(Read Uncommitted)
  • 读已提交(Read Committed)
  • 可重复读(Repeatable Read)
  • 串行化(Serializable)

分布式事务

  • 2PC(两阶段提交):协调者与参与者协作,但存在单点故障和阻塞问题。
  • TCC(Try-Confirm-Cancel):业务补偿机制,通过预留资源实现最终一致性。
  • Saga 模式:长事务拆分为多个本地事务,通过正向操作和补偿操作保证一致性。

适用场景

  • 传统关系型数据库(如 MySQL、PostgreSQL)的本地事务。
  • 跨库或跨服务的分布式事务(需结合分布式事务框架如 Seata)。

2. 消息队列事务

原理
消息队列事务用于保证 消息生产者与消费者之间的数据一致性,常见实现方式:

  • 事务消息(如 RocketMQ):

    1. 发送半消息(Half Message)到 Broker,暂不对消费者可见。
    2. 执行本地事务(如数据库操作)。
    3. 根据本地事务结果提交或回滚消息(Broker 确认消息是否投递)。
    4. Broker 提供事务状态回查机制,避免事务悬挂。
  • 最大努力通知(如 RabbitMQ):通过异步确认和重试保证最终一致性。

特点

  • 实现 业务逻辑与消息发送的原子性
  • 需要处理消息重复消费(需消费者幂等)。

适用场景

  • 异步解耦场景(如订单创建后发送消息通知库存系统)。
  • 分布式系统的最终一致性保证。

3. Redis 事务

原理
Redis 事务通过 MULTIEXECDISCARDWATCH 命令实现,本质是 命令队列的批量执行

  • MULTI:开启事务,后续命令入队。
  • EXEC:执行队列中的所有命令。
  • DISCARD:取消事务。
  • WATCH:监控 Key,若被修改则事务失败(乐观锁)。

特点

  • 不保证原子性:命令执行失败后不会回滚(仅语法错误会取消事务)。
  • 无隔离性:事务执行期间其他客户端命令可能被插入。

适用场景

  • 简单的批量操作(如增减库存、计数器)。
  • 结合 Lua 脚本实现复杂原子操作。

4. Spring 事务

原理
Spring 通过 声明式事务@Transactional 注解)和 编程式事务TransactionTemplate)管理事务,底层依赖事务管理器(如 DataSourceTransactionManager)。
核心机制

  • 事务传播行为:如 REQUIRED(默认)、REQUIRES_NEWNESTED
  • 隔离级别:与数据库隔离级别对应。
  • 回滚规则:指定哪些异常触发回滚。

分布式事务支持

  • JTA(Java Transaction API):适用于跨多个资源(如数据库、消息队列)的全局事务。
  • 整合 Seata:通过 AT 模式、TCC 模式实现分布式事务。

适用场景

  • 单数据源事务管理(如操作单个数据库)。
  • 微服务架构下的分布式事务(需结合其他框架)。

对比总结

特性数据库事务消息队列事务Redis 事务Spring 事务
原子性支持(ACID)最终一致性(事务消息)弱原子性(批量执行无回滚)依赖底层资源(如数据库)
隔离性多级别隔离(如 RC、RR)无隔离性无隔离性与数据库隔离级别一致
持久性强持久性(日志持久化)消息持久化(Broker 存储)依赖配置(AOF/RDB)依赖底层资源
应用场景数据强一致性操作异步解耦与最终一致性简单批量操作统一管理多种资源的事务
分布式支持需结合 2PC、TCC、Saga 等事务消息机制不支持支持(通过 JTA、Seata 等)

选型建议

  1. 数据库事务:适用于强一致性要求的业务(如支付、订单)。
  2. 消息队列事务:适用于异步解耦和最终一致性(如通知、日志)。
  3. Redis 事务:仅用于简单操作的批量执行,需结合 Lua 脚本保证原子性。
  4. Spring 事务:统一管理本地事务,分布式场景需结合 Seata、JTA 等框架。

常见问题

  1. Redis 事务为什么不支持回滚?
    Redis 的设计目标是高性能,回滚会增加复杂性和性能损耗,需开发者自行处理错误逻辑。

  2. 如何解决消息队列事务与数据库事务的一致性问题?
    使用 本地事务表 + 事务消息

    • 数据库操作与消息写入本地事务表在同一个事务中。
    • 后台任务轮询事务表,发送消息到 MQ 并删除记录。
  3. Spring 事务失效的场景?

    • 方法非 public
    • 自调用(未通过代理对象调用)。
    • 异常被捕获未抛出。
    • 数据库引擎不支持事务(如 MyISAM)。

通过合理选择事务机制,可以在性能、一致性和开发复杂度之间找到平衡。

相关文章:

【数据库事务、消息队列事务、Redis 事务、Spring 事务 详细分析】

数据库事务、消息队列事务、Redis 事务、Spring 事务** 的详细分析 在分布式系统和应用开发中,事务管理是确保数据一致性和可靠性的关键机制。以下是针对 数据库事务、消息队列事务、Redis 事务、Spring 事务 的详细分析,包括原理、特点、适用场景和对比…...

2-1 基本放大电路

放大的概念 mV →V mA→A 特征:放大功率(电压与电流)。 本质:能量在控制下的转换。(外接供电电源) 必要条件:有源元件(能量控制原件) 前提:不失真 测试的…...

什么是矩阵账号

矩阵账号是指在同一平台或多个平台上,围绕同一品牌或个人,创建的多个相互关联、协同工作的账号组合。这些账号虽然独立,但在内容定位和运营策略上有所区分,同时又相互引流,共同形成一个网络结构,类似于矩阵…...

【Linux】Ubuntu 24.04 LTS 安装 OpenJDK 8

目录 通过 apt-get 直接安装 JDK 1. 更新 apt 软件源 2. 检查 JDK 是否已安装 3. 安装OpenJDK 4. 检查 JDK 是否成功安装 5. 设置 JAVA_HOME 环境变量 找到需要设置的 Java 路径 使用文本编辑器打开/etc/environment文件 添加 Java 安装路径 应用更改和验证配置 通过…...

xcode开发swiftui项目的时候,怎么调试ui占位和ui大小

有时候元素之间可能存在很大的空间间隔,但是又不知道怎么产生的,无奈我又看不懂xcode里面的Debug View Hierarchy功能,只能使用笨方法,就是给不同的块元素设置上不同的背景色,然后看一下间隙区域到底是哪个背景色填充的…...

测试用例的优先级划分规则

测试用例的优先级划分是根据 业务重要性、风险程度、测试资源 等因素,确定测试执行的顺序,以最大化测试效率和风险控制。以下是常见的优先级划分规则和操作方法: 一、优先级划分的核心原则 风险驱动 高风险功能(如核心支付流程&a…...

信息安全的数学本质与工程实践

信息安全的本质是数学理论与工程实践的高度统一。在这个数字空间与物理世界深度融合的时代,信息安全已从简单的数据保护演变为维系数字社会正常运转的基础设施。对于计算机专业学习者而言,理解信息安全需要超越工具化认知,深入其数学内核与系…...

第 6 章:优化动态分配内存的变量_《C++性能优化指南》_notes

优化动态分配内存的变量 第六章核心知识点详解总结第六章 动态内存优化 重点难点梳理 一、多选题(每题至少2个正确答案)二、设计题答案与详解多选题答案设计题答案示例 第六章核心知识点详解 动态内存分配的开销 知识点:动态内存分配需要调用…...

k8s kubernetes dashboard一直CarshLoopBackoff

使用 kubectl get pods -A -o wide 发现pod一直CarshLoopBackoff 通过 kubectl describe pod kubernetes-dashboard-7c4f8ff86d-7k7bd -n kubernetes-dashboard 获取详细信息 发现一直报错 Warning Unhealthy 10m (x31 over 34m) kubelet Liveness probe fail…...

[C++面试] 你了解视图吗?

一、入门 1、什么是 C 视图(View)?请简要说明其概念和用途 它提供了对序列(如数组、容器等)的非拥有性、只读或可写的访问。(就像是个透明的放大镜,它能让你去看一组数据,但它自己…...

Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档(带图片)预览,并导出

Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档(带图片)预览,并导出 预览安装插件示例代码项目目录结构截图实际效果截图 动态渲染 .docx 文档(带图片),预览、导出安装插件docx 模板文件内容完整代码…...

ollama迁移已下载的单个模型到服务器

ollama迁移已下载的单个模型到服务器 场景 ollama是面向用户级的,部署和运行都很简单,是否高效就另说了。但最起码,他能充分利用用户的硬件设备,在GPU不足也能调用cpu和内存去加持。 ollama运行的模型基本是量化版本的&#xf…...

Photoshop 2025安装教程包含下载安装包,2025最新版图文安装教程

文章目录 前言一、Photoshop 2025下载二、Photoshop 2025安装教程1. 安装包解压2. 找到安装程序3. 以管理员身份运行4. 安装选项设置5. 选择安装路径6. 开始安装7. 安装完成8. 启动软件9. 软件主界面 前言 无论你是专业设计师,还是刚接触图像处理的新手&#xff0c…...

【Python · PyTorch】时域卷积网络 TCN

1. 概念 1.1 定义 TCN 是时域卷积网络(Temporal Convolutional Network)的简称。TCN是于2018年 Shaojie Bai 等人提出的一个处理时序数据的卷积模型。 TCN结合了CNN卷积并行性计算和RNN长期依赖的优势,CNN可在多个通道同时处理卷积核运算&…...

Mysql update更新数据执行流程

update 的执行流程是以select查询为基础执行的!!你不明白select执行流程?没关系,这篇博客照样让你明白,update执行流程! 存储引擎是什么? 如果把数据库比作一个大仓库,那么存储引擎…...

WMS WCS系统架构

1.1立体仓库现场网络架构图 1.2立体仓库WMS系统与WCS系统架构 1.3系统技术选型 WEB端技术:node.js、vue 、element、jquery、html、js、css等 API端技术:spring boot 、msyql、redis、mybatis等 WCS技术:c#、winform、OPC、socket、S7等 …...

数据结构5(初):续写排序

目录 1、外排序 2、计数排序 1、外排序 上一节中提到的排序都可以用来进行内排序&#xff0c;但是只有归并排序的思想可以用来进行外部排序&#xff0c;因为文件数据是没办法像数组那样进行访问的。 例如&#xff1a; #include <stdio.h> #include <assert.h> …...

ROS多机通信(三)——Ubuntu Ad-Hoc 组网通信配置指南

基本概念 Ad-Hoc 网络是一种简单的点对点无线网络&#xff0c;设备&#xff08;称为节点&#xff09;可以直接相互通信或者通过中继间接通信&#xff0c;而无需依赖中央接入点。在这种网络中&#xff0c;所有设备是对等的&#xff0c;没有固定的路由器或基础设施支持。 特点 …...

23种设计模式-状态(State)设计模式

状态设计模式 &#x1f6a9;什么是状态设计模式&#xff1f;&#x1f6a9;状态设计模式的特点&#x1f6a9;状态设计模式的结构&#x1f6a9;状态设计模式的优缺点&#x1f6a9;状态设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是状态设计模式…...

ARM架构薄记2——ARM学习架构抓手(以ARMv7为例子)

ARM架构薄记2——ARM学习架构抓手&#xff08;以ARMv7为例子&#xff09; ​ 架构学习需要学习哪一些部分呢&#xff1f;笔者接触过的架构有Intel-X86, AMD64&#xff0c;RISC-V和Arm架构&#xff08;V7最多&#xff09;&#xff0c;笔者简单的翻了一些课本和教材&#xff0c;…...

STM32C011 进入停止模式和待机模式

对于STM32C011J4M3微控制器&#xff0c;你可以使用HAL库来实现进入停止模式&#xff08;Stop Mode&#xff09;和待机模式&#xff08;Standby Mode&#xff09;。下面是进入停止模式和待机模式的示例代码&#xff1a; 进入停止模式代码示例&#xff1a; #include "stm3…...

kaggle上经典泰坦尼克项目数据分析探索

之前了解在kaggle上这个项目很火&#xff0c;最近想要加强一下python数据分析&#xff0c;所以在kaggle上找到这个项目进行学习探索&#xff0c;下面是将一些学习资料以及过程整理出来。 一、首先我们了解一下项目背景以及如何找到这个项目。 kaggle项目地址: https://www.k…...

影刀魔法指令3.0:开启自动化新篇章

在数字化飞速发展的今天&#xff0c;自动化工具已经成为提升工作效率、优化工作流程的重要手段。影刀RPA作为一款强大的自动化软件&#xff0c;其最近推出的魔法指令3.0版本&#xff0c;更是让人大开眼界&#xff0c;为自动化操作带来了全新的可能性。 影刀魔法指令3.0简介 影…...

15 python 数据容器-字典

在 Python 的编程世界里&#xff0c;字典是一种超实用的数据类型&#xff0c;它就像打工人的工作资料夹&#xff0c;能把各种不同类型的信息有条理地存起来&#xff0c;还能快速找到你需要的内容。对于刚开始学习编程的小伙伴来说&#xff0c;掌握字典的用法&#xff0c;能让你…...

Linux的一些常见指令

一、ls指令 语法&#xff1a; ls (选项) 功能&#xff1a; ls可以查看当前目录下的所有文件和目录。 常用选项&#xff1a; -a:列出目录下的所有文件&#xff0c;包括以点&#xff08;.&#xff09;开头的隐含文件 。-d:将目录像文件一样显示&#xff0c;不显示其下的文件。…...

Pre-flash和Main flash

在相机拍照过程中&#xff0c;Pre-flash&#xff08;预闪光&#xff09; 和 Main flash&#xff08;主闪光&#xff09; 是常见的两种闪光灯使用模式&#xff0c;通常用于提高低光环境下的拍摄质量&#xff0c;尤其在自动曝光&#xff08;AE&#xff09;和自动对焦&#xff08;…...

jmm-java内存模型

java内存模型----底层原理 底层原理 从Java代码到最终执行的CPU指令的流程&#xff1a; 最开始&#xff0c;我们编写的Java代码&#xff0c;是*.java文件在编译&#xff08;javac命令&#xff09;后&#xff0c;从刚才的*.java文件会变出一个新的Java字节码文件&#xff08;…...

合宙780E开发学习-LUATOS-SOC云编译自定义固件

登录https://luatos.com 点击登录&#xff0c;使用合宙erp账号登录即可 点击右上角构建&#xff0c;点击右上角菜单新构建&#xff0c;自定义构建名称&#xff0c;可新建多个 勾选想要的组件 点击右上角保存修改&#xff0c;只有点击准备就绪&#xff08;注意&#xff1a;一定…...

解决Centos使用yum命令报错“Cannot find a valid baseurl for repo: base/7/x86_64”问题

一、问题描述 我们在使用Centos7.9使用【sudo yum install influxdb2】命令安装influxDB数据库的时候提示“Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org/release=7&arch=x86_64&repo=os&infra=stock …...

好用的Markdown阅读编辑器Typora破解记录

Typora破解 一、下载Typora二、安装Typora三、破解Typora &#x1f600; 记录一下Typora破解记录&#xff0c;怕不常用忘记咯&#xff0c;感觉自己现在的脑子就像我的肠子一样&#xff0c;刚装进去就么得了。。。&#x1f614; Typroa算是用起来很舒服的Markdown阅读器了吧&am…...