0

0

mysql如何使用Read View控制可见性_mysql事务快照读解析

P粉602998670

P粉602998670

发布时间:2026-03-05 10:25:03

|

454人浏览过

|

来源于php中文网

原创

read view 是 innodb 执行快照读时当场生成的内存结构,用于判断数据行对当前事务是否可见;它非配置项、不持久、不共享,rr 级别下首次快照读创建并复用,rc 级别下每次快照读重建。

mysql如何使用read view控制可见性_mysql事务快照读解析

Read View 是什么,不是什么

Read View 不是 MySQL 里某个可配置的开关,也不是你 CREATE TABLE 时能指定的选项。它是 InnoDB 在执行 SELECT(快照读)时,**当场生成的一个内存结构**,用来决定“这一行数据对当前事务是否可见”。它不持久、不共享、不缓存——每次快照读都可能新建一个(取决于事务隔离级别和状态)。

容易踩的坑:误以为 START TRANSACTION 后立刻固定了 Read View;其实只有第一次快照读才创建,后续同事务内 SELECT 复用它——但 SELECT ... FOR UPDATEUPDATE 这类当前读不走它。

RR 隔离级别下 Read View 的生成时机

REPEATABLE READ 下,Read View 在事务中**第一次执行快照读时生成**,之后复用。这意味着:

  • 事务 A 执行 SELECT → 生成 Read View,记录当时活跃事务 ID 列表(m_ids)、最小未提交事务 ID(min_trx_id)、最大已提交事务 ID(max_trx_id)等
  • 事务 B 在此之后提交的修改,对事务 A 的后续 SELECT 不可见——哪怕 B 的 ID 小于 A 的 min_trx_id
  • 但如果事务 A 先执行 SELECT ... FOR UPDATE(当前读),再执行普通 SELECT,后者仍用原 Read View,不会因锁读而刷新

关键点:不是“事务开始时”建 Read View,而是“第一次快照读时”。空事务(只 BEGIN 不查)不触发,也不影响后续视图一致性。

考拉新媒体导航
考拉新媒体导航

考拉新媒体导航——新媒体人的专属门户网站

下载

RC 隔离级别下 Read View 每次都新建

READ COMMITTED 的行为截然不同:**每次快照读都重建 Read View**。所以:

  • 事务 A 第一次 SELECT 看不到事务 B 的未提交修改
  • B 提交后,A 再执行一次 SELECT 就能看到新数据——因为新建的 Read View 中,B 的事务 ID 已不在 m_ids
  • 这也意味着 RC 下无法避免“不可重复读”,但能避免“脏读”

性能影响:频繁快照读会多一次内存分配和活跃事务扫描(遍历 trx_sys->rw_trx_list),高并发下比 RR 略重,但换来语义清晰性。

如何验证当前事务的 Read View 内容

InnoDB 不提供 SQL 接口直接 dump Read View,但可通过调试或间接方式观察效果。常用验证手段:

  • 开启 innodb_status_output = ON,查 SHOW ENGINE INNODB STATUS,在 “TRANSACTIONS” 部分找当前事务的 Trx idTrx read view 行(仅 debug 版本或特定编译选项下可见)
  • 构造典型场景:两个事务分别插入/更新同一行,用 SLEEP(2) 控制时序,在 RR 下两次 SELECT 结果一致,在 RC 下可能不同
  • 注意:information_schema.INNODB_TRX 里的 TRX_ID 是事务 ID,不是 Read View 快照内容;别把它和可见性判断混为一谈

最常被忽略的是:Read View 只作用于聚簇索引记录的 DB_TRX_ID 字段比较,二级索引不存事务 ID,所以通过二级索引查找时,InnoDB 会回表到聚簇索引再判断可见性——这会影响执行计划和性能,尤其在覆盖索引失效时。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1090

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

380

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2008

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

379

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1560

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

585

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

438

2024.04.29

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

33

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.4万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 844人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号