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

mysql的快照读与当前读的区别

这两个是 MySQL InnoDB 在 MVCC 下的两种主要读方式,区别核心在于 是否加锁、是否读到最新数据


1. 快照读(Snapshot Read)

定义:
通过 MVCC(多版本并发控制) 机制读取某行数据的历史版本(基于事务启动时的快照),不加锁

特点:

  • 读的是事务开始时能看到的数据版本(符合隔离级别规则)。
  • 不会阻塞其他事务的更新,也不会被更新阻塞。
  • 实现原理依赖 InnoDB 的 undo log,在需要时从旧版本回溯数据。
  • 常用于 一致性非锁定读(Consistent Non-locking Read)。

典型 SQL:

SELECT * FROM table WHERE id = 1;

只要不是 SELECT ... LOCK 或加 FOR UPDATE,就是快照读。

适用场景:

  • 大部分普通查询
  • 减少锁竞争
  • 保证一致性读取

2. 当前读(Current Read)

定义:
直接读取 记录的最新版本,并且加锁,保证其他事务不能修改它直到当前事务结束(或释放锁)。

特点:

  • 读取的是此刻最新的数据版本。
  • 会加共享锁(S)排他锁(X),阻塞其他可能冲突的事务。
  • 常用于需要“读后立刻更新”的场景。

典型 SQL:

SELECT * FROM table WHERE id = 1 FOR UPDATE;   -- 加排他锁
SELECT * FROM table WHERE id = 1 LOCK IN SHARE MODE;  -- 加共享锁
UPDATE table SET value = value + 1 WHERE id = 1;      -- 更新也是当前读
DELETE FROM table WHERE id = 1;                       -- 删除也是当前读

适用场景:

  • 需要马上更新读取到的数据
  • 防止幻读、并发修改

3. 对比总结

维度快照读当前读
读取版本事务开始时可见版本(历史版本)最新版本
是否加锁❌ 否✅ 是
是否阻塞❌ 不阻塞✅ 可能阻塞或被阻塞
实现依赖MVCC + Undo Log锁(Record Lock, Gap Lock, Next-Key Lock)
场景普通查询更新前读取、并发控制

📌 记忆技巧:

  • “快照读” → 拍张照片,读照片里的数据,照片不会变(历史一致性)。
  • “当前读” → 直接看现实中的人,并且拉住他不让走(加锁防别人动数据)。

如果你愿意,我可以帮你画一张 事务时间线对比图,把快照读和当前读的可见性差异直观画出来,方便记忆。这样你在面试讲解时更容易说清楚。
你需要我画这张图吗?

http://www.dtcms.com/a/328931.html

相关文章:

  • 11G RAC数据文件创建到本地如何处理
  • 【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day3
  • 《算法导论》第 22 章 - 基本的图算法
  • [AXI5]AXI协议中的Scalar atomic和Vector atomic有什么区别?
  • 【算法】位运算经典例题
  • BM25:概率检索框架下的经典相关性评分算法
  • ADB 无线调试连接(Windows + WSL 环境)
  • 如何在VS里使用MySQL提供的mysql Connector/C++的debug版本
  • C++ 优选算法 力扣 209.长度最小的子数组 滑动窗口 (同向双指针)优化 每日一题 详细题解
  • Java Spring框架最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
  • graphql接口快速使用postman添加接口以及输入返回参数
  • 超越相似名称:Elasticsearch semantic text 如何在简洁、高效、集成方面超越 OpenSearch semantic 字段
  • 5.语句几个分类
  • 自建知识库,向量数据库 体系建设(四)之文本向量与相似度计算——仙盟创梦IDE
  • 药房智能盘库系统的Python编程分析与实现—基于计算机视觉与时间序列预测的智能库存管理方案
  • Ubuntu下快速安装Tomcat教程
  • ubuntu24.04安装 bpftool 以及生成 vmlinux.h 文件
  • 4 种方法将联系人从 iPhone 传输到 realme
  • java中在多线程的情况下安全的修改list
  • 【C++ STL】list详解和模拟
  • 冒泡排序专栏
  • Java研学-RabbitMQ(七)
  • LeetCode_二叉树
  • Python 中使用多进程编程的“三两”问题
  • 如何记录日常笔记?
  • AAT Bioquest 细胞凋亡检测方法集锦
  • 数组和矩阵的核心关系及关键区别
  • C# xml UI格式化字符串
  • Java -- Vector底层结构-- ArrayList和LinkedList的比较
  • 河南萌新联赛2025第五场 - 信息工程大学