MySQL中的快照读和当前读用法

 更新时间:2025年08月29日 10:14:02   作者:学亮编程手记  
快照读不加锁,读事务开始时的数据快照,确保一致性;当前读加锁,读最新数据,用于更新及锁定操作,两者在RC和RR隔离级别下表现不同,MVCC机制支持快照读,而加锁机制保障当前读的数据一致性

在 MySQL 的 InnoDB 存储引擎中,快照读(Snapshot Read)和当前读(Current Read)是两种不同的数据读取方式,它们的主要区别在于是否加锁以及数据一致性。

下面详细介绍这两种读取方式及其应用场景。

快照读(Snapshot Read)

快照读是一种非加锁的读取方式,它读取的是事务开始时的数据快照。

快照读主要用于读取数据的一致性视图,确保在一个事务中多次读取同一数据时结果一致。

特点

  1. 非加锁:快照读不会对数据加锁,因此是非阻塞的。
  2. 一致性视图:读取的是事务开始时的数据快照,不会看到其他事务在此期间对数据的更改。
  3. 多版本并发控制(MVCC):通过 MVCC 机制,快照读可以访问数据的多个版本,确保事务隔离。

应用场景

  • 读提交(Read Committed, RC)隔离级别:每次 SELECT 语句都会生成一个新的快照,读取的是当前已提交的数据。
  • 可重复读(Repeatable Read, RR)隔离级别:事务开始时生成一个快照,事务中的所有 SELECT 语句都会使用这个快照,确保事务中多次读取同一数据时结果一致。

示例

-- 会话 1
START TRANSACTION;
SELECT * FROM t_user;  -- 快照读,读取事务开始时的数据快照

-- 会话 2
START TRANSACTION;
UPDATE t_user SET age = 35 WHERE name = 'Bob';
COMMIT;

-- 会话 1
SELECT * FROM t_user;  -- 快照读,仍然读取事务开始时的数据快照

当前读(Current Read)

当前读是一种加锁的读取方式,它读取的是数据的最新版本,并且会对读取的数据加锁,以确保其他并发事务不能修改当前记录。

特点

  1. 加锁:当前读会对读取的数据加锁,确保数据的一致性和完整性。
  2. 最新版本:读取的是数据的最新版本,可以看到其他事务已经提交的更改。
  3. 事务隔离:通过加锁机制,确保事务的隔离性。

应用场景

  • 读提交(Read Committed, RC)隔离级别:当前读会读取最新的已提交数据。
  • 可重复读(Repeatable Read, RR)隔离级别:当前读会读取最新的已提交数据,并加锁。
  • 更新操作UPDATEDELETEINSERT 等修改数据的操作会触发当前读。
  • 锁定读SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODE 会触发当前读。

示例

-- 会话 1
START TRANSACTION;
SELECT * FROM t_user WHERE name = 'Bob' FOR UPDATE;  -- 当前读,读取最新版本并加锁

-- 会话 2
START TRANSACTION;
UPDATE t_user SET age = 35 WHERE name = 'Bob';  -- 被会话 1 的锁阻塞
COMMIT;

-- 会话 1
UPDATE t_user SET age = 40 WHERE name = 'Bob';  -- 更新操作,读取最新版本并加锁
COMMIT;

总结

  • 快照读:非加锁的读取方式,读取的是事务开始时的数据快照,确保事务中多次读取同一数据时结果一致。
  • 当前读:加锁的读取方式,读取的是数据的最新版本,确保数据的一致性和完整性。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySql数据库触发器使用教程

    MySql数据库触发器使用教程

    MySQL从5.0.2版本开始支持触发器,MySQL的触发器和存储过程一样,都是嵌入到MySQL服务器的一段程序,这篇文章主要给大家介绍了关于MySql数据库触发器使用的相关资料,需要的朋友可以参考下
    2022-05-05
  • MySQL底层数据结构选用B+树的原因

    MySQL底层数据结构选用B+树的原因

    大家好,本篇文章主要讲的是MySQL底层数据结构选用B+树的原因,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Mysql中分布式锁的具体实现

    Mysql中分布式锁的具体实现

    分布式锁开发中经常使用,本文主要介绍了Mysql中分布式锁的具体实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • mysql游标的原理与用法实例分析

    mysql游标的原理与用法实例分析

    这篇文章主要介绍了mysql游标的原理与用法,结合实例形式分析了mysql游标的概念、原理、用法及操作注意事项,需要的朋友可以参考下
    2020-04-04
  • MySQL中批量删除指定前缀表的sql语句

    MySQL中批量删除指定前缀表的sql语句

    有时候我们在安装一些cms的时候,这些cms都是带表前缀的方便区分数据,但有时候我们测试完需要删除的时候又有别的前缀表就可以参考下面的方法
    2013-06-06
  • MySQL中按照多字段排序及问题解决

    MySQL中按照多字段排序及问题解决

    这篇文章主要介绍了MySQL中按照多字段排序及问题解决的方法,非常的实用,有需要的小伙伴可以参考下。
    2015-03-03
  • MySQL中Binlog的完整格式解析(ROW 模式,默认)

    MySQL中Binlog的完整格式解析(ROW 模式,默认)

    本文介绍了MySQL 5.7中ROW格式的binlog的特性、解析方法和实战案例,包括MySQL 5.7的binlog核心特性、ROW格式binlog结构、解析命令、常见问题及解决方法等内容,需要的朋友可以参考下
    2026-03-03
  • MySql,MVCC实现及其机制,快照读在RC,RR下的区别说明

    MySql,MVCC实现及其机制,快照读在RC,RR下的区别说明

    这篇文章主要介绍了MySql,MVCC实现及其机制,快照读在RC,RR下的区别说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • windows上的mysql服务突然消失提示10061 Unkonwn error问题及解决方案

    windows上的mysql服务突然消失提示10061 Unkonwn error问题及解决方案

    windows10 系统,今天早晨系统自己更新了下,也没啥问题,突然发现电脑上安装的mysql 服务没了,经过一系列原因分析终于找到解决方案,今天小编给大家分享mysql服务突然消失:10061 Unkonwn error解决方法,一起看看吧
    2023-07-07
  • 详解如何对MySQL数据库进行授权管理

    详解如何对MySQL数据库进行授权管理

    MySQL数据授权是指数据库管理员通过设置权限,控制用户对数据库中的数据的访问和操作能力,在MySQL中,每个用户账户都有特定的权限,本文给大家介绍了如何对MySQL数据库进行授权管理,需要的朋友可以参考下
    2024-11-11

最新评论