Plantre Plantre
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

plantre

一个后端开发者
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机组成原理

  • 操作系统

  • 计算机网络

  • 设计模式

  • Java

  • Spring

  • SpringCloud

  • MySQL

    • MySQL的权限控制
    • 精细权限管制示例
    • localhost和127.0.0.1的区别-MySQL
    • mysql数据类型
    • 当前读和快照读
    • MySQL中MVCC的实现原理
    • MySQL中MVCC具体用了多少个隐藏字段
    • 锁和事务的关系
    • FOR UPDATE锁类型
  • Redis

  • 分布式

  • Zookeeper

  • Dubbo

  • Kafka

  • 数据结构

  • 算法

  • OJ

  • 从道家哲学看计算机?
  • 后端
  • MySQL
plantre
2025-05-06

当前读和快照读

当前读与快照读的核心区别及实现原理

一、定义与核心特性

  1. 当前读(Current Read)
    • 定义:读取数据库当前最新的已提交数据,并对数据加锁以保证一致性。

    • 特性:

    ◦ 加锁机制:使用共享锁(S锁)或排他锁(X锁),阻塞其他事务的写操作。

    ◦ 数据最新性:总是读取最新版本,反映其他事务已提交的修改。

    ◦ 应用场景:需强一致性的操作(如库存扣减、金融交易)。

  2. 快照读(Snapshot Read)
    • 定义:读取事务开始时的数据快照,基于MVCC机制实现非锁定读。

    • 特性:

    ◦ 非阻塞:不锁定数据,允许其他事务并发修改。

    ◦ 一致性视图:读取的是历史版本,避免脏读和不可重复读。

    ◦ 应用场景:高并发查询(如报表统计、商品浏览)。


二、实现原理对比

  1. 快照读的底层机制(MVCC)
    • 版本链管理:通过隐藏字段DB_TRX_ID(事务ID)、DB_ROLL_PTR(回滚指针)维护数据的历史版本,形成Undo Log版本链。

    • Read View:事务启动时生成一致性视图,包含活跃事务ID列表(m_ids)、最小事务ID(min_trx_id)等参数,判断数据版本的可见性。

    • 隔离级别影响:

    ◦ RR(可重复读):事务内首次快照读生成Read View,后续复用该视图。

    ◦ RC(读已提交):每次快照读生成新Read View,反映最新已提交数据。

  2. 当前读的底层机制(锁与MVCC协同)
    • 行级锁:使用共享锁(LOCK IN SHARE MODE)或排他锁(FOR UPDATE),确保数据在事务执行期间不被修改。

    • 间隙锁:在RR级别下,通过锁定索引范围(Next-Key Lock)防止幻读。

    • 与MVCC的交互:当前读会绕过快照视图,直接访问最新数据版本,并强制加锁。


三、关键差异总结

维度 快照读 当前读
锁定机制 无锁,非阻塞读 加共享锁(S)或排他锁(X),阻塞其他写操作
数据一致性 基于事务开始时的快照,可能无法反映最新数据 读取最新已提交数据,强一致性
并发性能 高(无锁竞争) 低(锁阻塞可能引发等待)
幻读问题 可能发生(RR级别下通过视图忽略新增数据) 通过间隙锁避免
典型SQL语句 普通SELECT SELECT ... FOR UPDATE、UPDATE、DELETE等

四、实际开发建议

  1. 优先使用快照读的场景
    • 读多写少:如商品详情页、数据分析报表,通过MVCC避免锁竞争提升吞吐量。

    • 长事务查询:需保证事务内多次读取结果一致(如生成对账单)。

  2. 必须使用当前读的场景
    • 数据强一致性要求:如库存扣减、账户余额更新,需锁定数据防止并发覆盖。

    • 先查后改逻辑:例如“查询是否存在后插入”,需通过当前读加锁避免竞态条件。

  3. 混合使用的注意事项
    • 隔离级别与锁的协同:在RR级别下,快照读与当前读混合使用时,需注意间隙锁对范围查询的影响。

    • 死锁风险:当前读加锁顺序需保持一致,避免循环等待(如多个事务按不同顺序锁定资源)。


五、示例分析 场景:事务A(ID=100)查询商品库存并扣减:

  1. 快照读阶段:SELECT stock FROM product WHERE id=1;(读取事务开始时的快照,假设库存为10)。
  2. 当前读阶段:SELECT stock FROM product WHERE id=1 FOR UPDATE;(加排他锁,读取最新库存为8)。
  3. 更新操作:UPDATE product SET stock=7 WHERE id=1;(基于当前读结果修改,避免超卖)。

结果:快照读保证事务内逻辑判断的一致性,当前读确保最终操作的强一致性。


通过合理选择快照读与当前读,开发者可以在数据库并发控制中平衡性能与一致性需求。两者的核心差异在于锁机制与数据版本的访问策略,需结合业务场景和隔离级别灵活应用。

编辑 (opens new window)
上次更新: 2025/06/13, 00:51:28
mysql数据类型
MySQL中MVCC的实现原理

← mysql数据类型 MySQL中MVCC的实现原理→

最近更新
01
集成loki
07-04
02
TCP的ESTABLISHED是什么意思
06-24
03
安装1panel
06-24
更多文章>
Theme by Vdoing | Copyright © 2025-2025 plantre | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式