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中max_connections与max_user_connections的区别

    解析mysql中max_connections与max_user_connections的区别

    本篇文章是对mysql中max_connections与max_user_connections的区别进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • mysql技巧之select count的区别分析

    mysql技巧之select count的区别分析

    在工作过程中,时不时会有开发咨询几种select count()的区别,我总会告诉他们使用select count(*) 就好。下文我会展示几种sql的执行计划来说明为啥是这样。
    2013-08-08
  • Ubuntu 20.04 安装和配置MySql5.7的详细教程

    Ubuntu 20.04 安装和配置MySql5.7的详细教程

    这篇文章主要介绍了Ubuntu 20.04 安装和配置MySql5.7的相关资料,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • MySql 8.0.11安装配置教程

    MySql 8.0.11安装配置教程

    这篇文章给大家介绍了MySql 8.0.11安装配置教程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,感兴趣的朋友一起看看吧
    2018-05-05
  • mysql数据库数据批量插入的实现

    mysql数据库数据批量插入的实现

    本文介绍了在MySQL数据库中进行数据批量插入和性能测试的方法,包括使用Navicat批量插入数据、编写SQL测试、索引的创建和使用、查询测试以及提升SQL性能的优化方法,感兴趣的可以参考一下
    2024-11-11
  • MySQL分库分表动态扩容缩容方式

    MySQL分库分表动态扩容缩容方式

    MySQL分库分表动态扩容缩容方案,通过选择数据库中间件,设计分库分表方案,进行环境测试,完成单库单表到分库分表的迁移,实现双写方案,并上线提供服务,扩容时,通过增加数据库服务器,呈倍数扩容,由DBA负责库表迁移,无需修改路由规则,即可基于新的资源提供服务
    2025-02-02
  • KubeSphere部署mysql的详细步骤

    KubeSphere部署mysql的详细步骤

    本文介绍了在KubeSphere中部署Mysql的详细步骤,包括创建mysql配置、pvc挂载、工作负载、服务,并测试数据库连接,步骤详尽,包括yaml配置和环境变量设置,特别强调了路径一致性和外部访问设置,还提到了使用NodePort模式解决自定义域名连接问题
    2024-10-10
  • mysql启动时出现ERROR 2003 (HY000)问题的解决方法

    mysql启动时出现ERROR 2003 (HY000)问题的解决方法

    这篇文章主要为大家详细介绍了mysql启动时出现ERROR 2003 (HY000问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • MySQL 请选择合适的列

    MySQL 请选择合适的列

    如果你的表结构设计不良或你的索引设计不佳,那么请你优化你的表结构设计和给予合适的索引,这样你的查询性能就能提高几个数量级。——数据越大,索引的价值越能体现出来
    2012-05-05
  • MySQL8.0.32的安装与配置超详细图文教程

    MySQL8.0.32的安装与配置超详细图文教程

    这篇文章主要介绍了MySQL8.0.32的安装与配置超详细图文教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03

最新评论