MySQL中的快照读和当前读用法
更新时间:2025年08月29日 10:14:02 作者:学亮编程手记
快照读不加锁,读事务开始时的数据快照,确保一致性;当前读加锁,读最新数据,用于更新及锁定操作,两者在RC和RR隔离级别下表现不同,MVCC机制支持快照读,而加锁机制保障当前读的数据一致性
在 MySQL 的 InnoDB 存储引擎中,快照读(Snapshot Read)和当前读(Current Read)是两种不同的数据读取方式,它们的主要区别在于是否加锁以及数据一致性。
下面详细介绍这两种读取方式及其应用场景。
快照读(Snapshot Read)
快照读是一种非加锁的读取方式,它读取的是事务开始时的数据快照。
快照读主要用于读取数据的一致性视图,确保在一个事务中多次读取同一数据时结果一致。
特点
- 非加锁:快照读不会对数据加锁,因此是非阻塞的。
- 一致性视图:读取的是事务开始时的数据快照,不会看到其他事务在此期间对数据的更改。
- 多版本并发控制(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)
当前读是一种加锁的读取方式,它读取的是数据的最新版本,并且会对读取的数据加锁,以确保其他并发事务不能修改当前记录。
特点
- 加锁:当前读会对读取的数据加锁,确保数据的一致性和完整性。
- 最新版本:读取的是数据的最新版本,可以看到其他事务已经提交的更改。
- 事务隔离:通过加锁机制,确保事务的隔离性。
应用场景
- 读提交(Read Committed, RC)隔离级别:当前读会读取最新的已提交数据。
- 可重复读(Repeatable Read, RR)隔离级别:当前读会读取最新的已提交数据,并加锁。
- 更新操作:
UPDATE、DELETE、INSERT等修改数据的操作会触发当前读。 - 锁定读:
SELECT ... FOR UPDATE和SELECT ... 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的区别进行了详细的分析介绍,需要的朋友参考下2013-06-06
Ubuntu 20.04 安装和配置MySql5.7的详细教程
这篇文章主要介绍了Ubuntu 20.04 安装和配置MySql5.7的相关资料,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-12-12
mysql启动时出现ERROR 2003 (HY000)问题的解决方法
这篇文章主要为大家详细介绍了mysql启动时出现ERROR 2003 (HY000问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2018-03-03


最新评论