事务隔离(MySQL)

事务隔离 —— 为什么你改了我还看不见?

在数据库中,事务(Transaction) 用于保证一组数据库操作要么全部成功,要么全部失败,这是一种原子性的操作机制。在 MySQL 中,事务的支持由存储引擎层实现。但并非所有引擎都支持事务,比如 MySQL 原生的 MyISAM 引擎就不支持事务,而 InnoDB 引擎 则是主流的支持事务的引擎。


一、事务的四大特性(ACID)

特性含义
原子性(Atomicity)事务中包含的所有操作要么全部成功,要么全部失败
一致性(Consistency)事务执行前后,数据库都处于一致状态
隔离性(Isolation)并发执行的事务之间彼此隔离,互不影响
持久性(Durability)事务一旦提交,对数据库的修改就是永久性的,即使系统故障也不会丢失

二、隔离性与隔离级别

当多个事务并发执行时,若没有隔离,就可能导致以下问题:

  • 脏读(Dirty Read):读取到未提交事务的数据
  • 不可重复读(Non-repeatable Read):同一事务中多次读取同一数据,值却不同
  • 幻读(Phantom Read):同一事务中两次查询返回的记录数不同

为解决这些问题,SQL 标准定义了四种隔离级别:

1. 四大隔离级别说明

隔离级别描述会发生的问题
Read Uncommitted(读未提交)可以读取未提交事务修改的数据脏读、不可重复读、幻读
Read Committed(读已提交)只能读取已提交事务修改的数据不可重复读、幻读
Repeatable Read(可重复读)同一事务内多次读取结果一致(MySQL 默认)幻读(依赖间隙锁解决)
Serializable(可串行化)强制事务串行执行,防止并发无脏读/不可重复读/幻读,但效率低

注意:隔离级别越高,性能越差。需要根据业务需求做权衡。

2. 示例说明(图示说明略,可自己绘图添加)

假设有两个事务 A 和 B,对某行数据进行读写操作:

  • 读未提交 下,事务 A 会看到事务 B 的未提交修改
  • 读已提交 下,A 只能看到 B 已提交的修改
  • 可重复读 下,A 在整个事务中看到的始终是开始时的数据快照
  • 串行化 下,B 的写操作会被阻塞,直到 A 完成

3. MySQL 中隔离级别的实现方式

  • Read Uncommitted:直接读取最新数据,无视事务
  • Read Committed:每次 SQL 执行前创建一个视图(Read View)
  • Repeatable Read:在事务开始时创建视图,期间一直使用同一个视图
  • Serializable:加锁控制并发,防止冲突

在 MySQL 中,默认隔离级别为 Repeatable Read,但 Oracle 默认是 Read Committed

查询当前隔离级别

SHOW VARIABLES LIKE 'transaction_isolation';

三、事务隔离的实现机制(MVCC)

以“可重复读”为例,MySQL 使用 多版本并发控制(MVCC) 来实现事务隔离。

1. 回滚日志机制

  • 每条记录在更新时都会生成一条回滚日志(undo log)
  • 当前值可以通过逐步回滚恢复到历史版本
  • 不同事务通过自己的视图(Read View)看到的版本可能不同

例如,某值从 1 → 2 → 3 → 4,回滚日志如下:

当前值回滚日志
43、2、1

视图 A 启动于值为 1 时,则通过回滚可看到 1;视图 B 则可能看到 2。

2. MVCC 的优点

  • 允许读取操作不加锁,提升并发性能
  • 实现隔离级别无需加重锁负担

3. 回滚日志的回收问题

  • 回滚日志会在无事务再引用时被清除
  • 长事务 会阻止日志清理,导致存储膨胀

实例:某系统数据仅 20GB,但 undo 日志达 200GB,最终只能重建数据库解决。


四、事务的启动方式及建议

1. 显式启动事务

BEGIN;
-- 或
START TRANSACTION;
-- 提交或回滚
COMMIT;
ROLLBACK;

2. 隐式启动方式:autocommit=0

SET autocommit = 0;
  • 此模式下,即使执行一个简单的 SELECT,也会自动开启事务
  • 若未手动 COMMITROLLBACK,事务将一直占用资源,形成 隐性长事务

建议

  • 使用 SET autocommit=1(默认),通过显式语句控制事务
  • 使用 COMMIT WORK AND CHAIN 可在提交后立即开启下一个事务
-- 查看运行超过60秒的事务
SELECT * 
FROM information_schema.innodb_trx 
WHERE TIME_TO_SEC(TIMEDIFF(NOW(), trx_started)) > 60;

五、总结

  • 事务隔离是数据库并发控制的核心机制
  • 在 MySQL 中,推荐使用默认的 Repeatable Read + MVCC 实现事务隔离
  • 尽量避免隐式长事务,主动控制事务生命周期
  • 根据实际业务权衡性能与隔离性的需求

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

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

相关文章

华为昇腾910B通过vllm部署InternVL3-8B教程

前言 本文主要借鉴:VLLM部署deepseek,结合自身进行整理 下载模型 from modelscope import snapshot_download model_dir snapshot_download(OpenGVLab/InternVL3-8B, local_dir"xxx/OpenGVLab/InternVL2_5-1B")环境配置 auto-dl上选择单卡…

Spring Boot 3 + Undertow 服务器优化配置

优化背景 当你的application需要支持瞬时高并发的时候,tomcat已经不在是最优的选择,我们可以改为Undertow,并对其进行优化。 Undertow 是一个轻量级的、高性能的Java Web 服务器,由JBoss 开发并开源。它是基于非阻塞(…

利用 Python pyttsx3实现文字转语音(TTS)

今天,我想跟大家分享如何利用 Python 编程语言,来实现文字转换为语音的功能,也就是我们常说的 Text-to-Speech (TTS) 技术。 你可能会好奇,为什么学习这个?想象一下,如果你想把书本、文章、杂志的内容转换…

vue修改了node_modules中的包,打补丁

1、安装patch npm i patch-package 安装完成后,会在package.json中显示版本号 2、在package.json的scripts中增加配置 "postinstall": "patch-package" 3、执行命令 npx patch-package 修改的node_modules中的包的名称 像这样 npx patch-packag…

Vue3快速入门/Vue3基础速通

Vue3 渐进式的javascript框架&#xff0c;我们可以逐步引入vue的功能 官方文档 Vue.js中文手册 你可以借助 script 标签直接通过 CDN 来使用 Vue&#xff1a; <script src"https://unpkg.com/vue3/dist/vue.global.js"></script>通过 CDN 使用 Vue 时…

[人机交互]理解界面对用户的影响

零.重点 – 什么是情感因素 – 富有表现力的界面 – 用户的挫败感 – 拟人化在交互设计中的应用 – 虚拟人物&#xff1a;代理 一.什么是情感方面 情感是指某事物对心理造成的一种状态 二.计算机科学中存在的两个相关的研究领域 2.1情感计算 机器如何能感知其他代理的情感&…

Ubuntu22.04及以上版本buildroot SIGSTKSZ 报错问题

本文提供一种解决 Buildroot SIGSTKSZ 报错途径 解决途径来源参考&#xff1a;Buildroot error when building with Ubuntu 21.10 其出现原因在于 GNU C Library 2.34 release announcement&#xff1a; Add _SC_MINSIGSTKSZ and _SC_SIGSTKSZ. When _DYNAMIC_STACK_SIZE_SOU…

Spark处理过程-案例数据清洗

&#xff08;一&#xff09;需求说明 准备十条符合包含用户信息的文本文件&#xff0c;每行格式为 姓名,年龄,性别&#xff0c;需要清洗掉年龄为空或者非数字的行。 例如&#xff1a; 张三,25,男 李四,,女 王五,30,男 赵六,a,女 孙七,35,男 周八,40,女 吴九,abc,男 郑十,45,女…

多模态大语言模型arxiv论文略读(六十五)

VS-Assistant: Versatile Surgery Assistant on the Demand of Surgeons ➡️ 论文标题&#xff1a;VS-Assistant: Versatile Surgery Assistant on the Demand of Surgeons ➡️ 论文作者&#xff1a;Zhen Chen, Xingjian Luo, Jinlin Wu, Danny T. M. Chan, Zhen Lei, Jinqi…

五子棋html

<!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8" /> <meta name"viewport" content"widthdevice-width, initial-scale1" /> <title>五子棋游戏</title> <style>bo…

算法训练营第十一天|150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素

150. 逆波兰表达式求值 题目 思路与解法 第一思路&#xff1a; 比较简单 class Solution:def evalRPN(self, tokens: List[str]) -> int:stack []for item in tokens:if item ! and item ! - and item ! * and item ! / :stack.append(item)else:b int(stack.pop())a …

原生 IP(Native IP)

目录 一、核心特点 二、原生 IP 的常见应用 三、原生 IP vs. 数据中心 IP 四、如何获取原生 IP&#xff1f; 五、原生 IP 的优缺点 六、实际案例 原生 IP&#xff08;Native IP&#xff09; 是指由互联网服务提供商&#xff08;ISP&#xff09;直接分配给用户的 IP 地址&…

k8s的pod挂载共享内存

k8s的pod挂载共享内存&#xff0c;限制不生效问题&#xff1a; 注&#xff1a;/dev/shm 是 Linux 系统中用于共享内存的特殊路径。通过将 emptyDir 的 medium 设置为 Memory&#xff0c;可以确保 /dev/shm 正确地挂载到一个基于内存的文件系统&#xff0c;从而实现高效的共享内…

DOCX转PDF怎么操作最简单?快速将DOCX转换为专业PDF文档

在日常办公或学习中&#xff0c;我们经常需要将 Word 文档&#xff08;.docx格式&#xff09;转换为 PDF 文件。这不仅有助于保持文档格式的一致性&#xff0c;还能确保接收者无需特定软件即可查看文件内容。本文将详细介绍几种常见的方法来实现从 DOCX 到 PDF 的转换&#xff…

VUE+ElementUI 使用el-input类型type=“number” 时,取消右边的上下箭头

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 在项目中有时候需要输入框的type“number”&#xff0c;这个时候&#xff0c;输入框的右边就会出现两个按钮&#xff0c;这两个按钮可以递增/递减&#xff0c;但是这样输入框看上去就不太美观&#x…

深入浅出理解常见的分布式ID解决方案

目录 UUID 自增ID 数据库多主模式 号段模式 Redis 雪花算法 百度 UIDgenerator 美团Leaf 滴滴TinyID 实战中的分布式ID生成器&#xff01;保障数据唯一性的核心组件 怎么编写Lua脚本是关键 怎么执行&#xff1f; 总结 分布式ID在构建大规模分布式系统时扮演着至关…

技术视界 | 青龙机器人训练地形详解(一):如何创建一个地形

机器人强化学习中的地形训练是利用强化学习算法让机器人在不同地形环境中通过试错学习最优行为策略的过程&#xff0c;通过环境建模、策略学习与优化等环节&#xff0c;使机器人能够自主适应复杂多变的地形&#xff0c;提高其移动效率、稳定性和自主性&#xff0c;减少人为干预…

【SGL】Scatter-Gather List内存传输技术

文章目录 1. What is SGL&#xff1f;2. sgl内存传输的原理2.1 核心思想2.2 sgl数据结构2.3 摘链和挂链 3. 零拷贝技术3.1 问题背景3.2 零拷贝的核心思想及实现方式 4. sgl在存储行业的应用 1. What is SGL&#xff1f; sgl&#xff08;Scatter-Gather List&#xff09;内存传…

10.idea中创建springboot项目_jdk17

10.idea中创建springboot项目_jdk17 一、前期准备 安装与配置&#xff1a; 确保已安装 IntelliJ IDEA配置好 JDK17 二、创建 Maven 项目 新建项目&#xff1a; 点击 File → New → Project&#xff0c;选择左侧的 Maven。填写项目名称&#xff08;如 demo&#xff09;、存…

如何使用极狐GitLab 软件包仓库功能托管 ruby?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 软件包库中的 Ruby gems (BASIC ALL) WARNING:Ruby gems 软件包库正在开发中&#xff0c;由于功能有限&#xff0c;尚未准备好…