小识MySQL中当前读CR和快照读SR

embedded/2025/1/12 23:26:47/

在MySQL中,尤其是使用InnoDB存储引擎时,存在两种主要的读取方式:当前读(Current Read)和快照读(Snapshot Read)。以下是关于这两种读取方式的详细解释和对比:

一、快照读(Snapshot Read)

  1. 定义

    • 快照读是指读取数据时获取的是数据在某个时间点的一致性视图,而不是当前最新的数据。它通常用于实现多版本并发控制(MVCC),确保在同一事务中多次读取同一数据时结果一致。
  2. 特点

    • 不会对数据加锁,因此是非阻塞的,能够支持高并发读取。
    • 读取的是事务开始时的数据快照,确保在一个事务中多次读取同一数据时结果一致。
  3. 使用场景

    • 主要用于SELECT语句,不包括带有FOR UPDATE或LOCK IN SHARE MODE的SELECT语句。
    • 适用于并发访问量较大、读操作较多的场景,以及不需要最新数据,只需要事务开始时数据一致性的场景。
  4. 实现机制

    • 在可重复读(Repeatable Read)隔离级别下,快照读通过MVCC机制避免不可重复读。MVCC为每个数据行维护多个版本,每个版本都有一个特定的事务ID或时间戳。当一个事务读取数据时,会根据版本号或时间戳选择一个可见的版本。

二、当前读(Current Read)

  1. 定义

    • 当前读是指读取数据时获取的是数据的最新版本,并且在读取时会对数据加锁,以确保其他并发事务不能修改当前记录。
  2. 特点

    • 会对读取的数据加锁,以确保数据的一致性和完整性。
    • 读取的是数据的最新版本,能够反映数据库在读取时刻的最新状态。
  3. 使用场景

    • 用于需要读取最新数据并确保数据一致性的场景,如SELECT ... FOR UPDATE、SELECT ... LOCK IN SHARE MODE、UPDATE、DELETE、INSERT等语句。
    • 适用于需要严格保证数据一致性和隔离性的场景。
  4. 实现机制

    • 当前读通过加锁机制确保读取到最新数据。锁可以是行锁、表锁、间隙锁或临键锁等。在读取数据时,当前读会对读取的数据行加锁,以防止其他事务并发修改。

三、区别与对比

  1. 读取的数据版本

    • 快照读:读取的是事务开始时的数据快照。
    • 当前读:读取的是数据的最新版本。
  2. 加锁机制

    • 快照读:不会对数据加锁,是非阻塞的。
    • 当前读:会对读取的数据加锁,以确保数据的一致性和完整性。
  3. 使用场景

    • 快照读:适用于并发访问量较大、读操作较多的场景,以及不需要最新数据,只需要事务开始时数据一致性的场景。
    • 当前读:适用于需要读取最新数据并确保数据一致性的场景,以及需要严格保证数据一致性和隔离性的场景。
  4. 性能影响

    • 快照读:由于不会对数据加锁,因此能够支持高并发读取,提高系统性能。
    • 当前读:由于会对数据加锁,因此在高并发场景下可能会导致锁争用,降低系统性能。但在需要确保数据一致性和完整性的场景下,当前读是必需的。

综上所述,当前读和快照读在MySQL中各有其适用场景和性能特点。在选择使用哪种读取方式时,需要根据具体的应用场景和需求进行权衡。

(望各位潘安、各位子健不吝赐教!多多指正!🙏)


http://www.ppmy.cn/embedded/153405.html

相关文章

Django Admin中添加自定义按钮与默认按钮并列

引言 在Django Admin中,我们经常需要添加自定义操作按钮,以便管理员可以快速执行特定任务。本文将介绍如何在Django Admin中添加一个自定义按钮(如"同步ECR仓库"),并将其与默认的"添加"、"删除"按钮放在同一级别。 © ivwdcwso (ID: u01217…

【架构设计】新闻推送系统设计

系统需求与估算 功能需求:包括提要发布、检索、通知和分析等功能。非功能需求:需具备高可用性和低延迟特性。估算数据:假设每天有 2000 万活跃用户,每人每天调整五次,由此可得每秒约接收 1000 条推文,按 10…

oracle闪回恢复数据:(闪回查询,闪回表,闪回库,回收站恢复)

oracle的闪回查询,可以查询提交在表空间的闪回数据,并可以还原所查询的数据,用于恢复短时间内的delele 或者 update 误操作,非常方便,缺点是只能恢复大概几小时内的数据。 文章目录 概要闪回查询恢复数据的主要方法包括…

SpringBoot的@Scheduled和@Schedules有什么区别

Scheduled 的详细解析 参数详解 cron: 使用Cron表达式来指定复杂的调度模式。Cron表达式的格式如下: 秒(0-59)分钟(0-59)小时(0-23)日(1-31)月(1-12 或 JAN-…

哈希表及模拟实现

目录 一、哈希表的概念 二、模拟实现哈希表 1.开放地址法 (1)哈希表的数据加上状态标志 (2)哈希表扩容:载荷因子 (3)哈希函数:不同数据类型转换为整型 (4)完整代码 2.链地址法(哈希桶) (1)哈希表扩容:载荷因子…

分布式ID—雪花算法

背景 现在的服务基本是分布式、微服务形式的,而且大数据量也导致分库分表的产生,对于水平分表就需要保证表中 id 的全局唯一性。 对于 MySQL 而言,一个表中的主键 id 一般使用自增的方式,但是如果进行水平分表之后,多…

Java 的单例模式详解及优化

💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…

蓝桥杯算法|练习记录

位运算 按位与运算符(&) 运算规则:两位同时为1,结果才为1,否则结果为0。例如, -3(在计算机中表示为1101)&5(0101) 0101(即十进制的1&…