幻读“异常”引出的快照读创建点问题

简介: 幻读“异常”引出的快照读创建点问题

导读

重温快照读、当前读。

本文节选自叶金荣有赞专栏《乱弹MySQL》。

关于InnoDB在事务中何时创建read view,我在 InnoDB MVCC何时创建read view 这篇文章里已经说过,在RC(read committed)隔离级别下是每次SELECT都会构造最新的read view,而在RR(repeatable read)隔离级别下是在事务中发起第一个SELECT时构造read view。接下来我们来看一个幻读的案例。先看运行环境:

[root@yejr.me]>\s
...
Server version:     5.6.21-log MySQL Community Server (GPL)
...
[root@yejr.me]>select * from information_schema.GLOBAL_VARIABLES where
    VARIABLE_NAME = 'innodb_locks_unsafe_for_binlog';
+--------------------------------+----------------+
| VARIABLE_NAME                  | VARIABLE_VALUE |
+--------------------------------+----------------+
| INNODB_LOCKS_UNSAFE_FOR_BINLOG | ON             |
+--------------------------------+----------------+
[root@yejr.me]>select @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ       |
+-----------------------+

也就是在RR隔离级别下,又设置了 INNODB_LOCKS_UNSAFE_FOR_BINLOG=1,其效果相当于禁用GAP LOCK。换言之,也相当于是把隔离级别降到了RC,这时候会产生幻读。P.S,关于INNODB_LOCKS_UNSAFE_FOR_BINLOG=1有几点提醒:

  • 已经使用RR级别时,最好就不要再将该选项设置为1了,否则有可能会造成主从数据不一致(这时应该同时设置binlog_format=ROW
  • 该选项设置为1时,唯一键和外键约束检测依然会使用next-key lock
  • 该选项只能在启动时设置,且不能在运行过程中动态修改,而事务隔离级别则可以在运行过程中动态修改。从这方面出发,其实有需要的话,最好是自行调整隔离级别就好,而不是设置本选项
  • 该选项从8.0版本开始已经被删除

接来看下这种情况下的幻读案例场景。关于测试表的背景信息:

[root@yejr.me]> show create table t1\G
CREATE TABLE `t1` (
  `c1` int(10) unsigned NOT NULL DEFAULT 0,
  `c2` int(10) unsigned NOT NULL DEFAULT 0,
  PRIMARY KEY (`c1`),
  KEY `c2` (`c2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

场景1

session1 session2
begin; begin;
select * from t1 where c2 = 5;
...
| 5 | 5 |


select * from t1 where c2 = 5;
...
| 5 | 5 |
insert into t1 select 7,5;
commit;


select * from t1 where c2 = 5 for update;
...
| 5 | 5 |
| 7 | 5 |

select * from t1 where c2 = 5;
#去掉for update后,只能看到一条记录
...
| 5 | 5 |

场景2

session1 session2
begin; begin;
select * from t1 where c2 = 5;
...
| 5 | 5 |


select * from t1 where c2 = 5 for update;
...
| 5 | 5 |
insert into t1 select 7,5;
commit;
#不会被阻塞


select * from t1 where c2 = 5;
...
| 5 | 5 |
| 7 | 5 |
#看到两条记录,疑似发生了幻读?

场景3

session1 session2
begin; start transaction with consistent snapshot;
select * from t1 where c2 = 5;
...
| 5 | 5 |

insert into t1 select 7,5;
commit;


select * from t1 where c2 = 5 for update;
...
| 5 | 5 |
| 7 | 5 |

select * from t1 where c2 = 5;
#去掉for update后,只能看到一条记录
...
| 5 | 5 |

咦,这个案例看起来和场景1有点像?注意到上面3个案例之间的区别了吗,我们来罗列一下:

  • 场景1,session2的第一个select是在session1执行commit之后发起的,此时构建read view
  • 场景2,session2的第一次读是select ... for update形式的,此时似乎没有创建read view
  • 场景3,session2发起事务时直接加了with consistent snapshot,也就是要求创建一致性快照读
  • 看起来场景1和场景3,都是在事务提交前创建了read view
  • 而场景2里,session2是在第二次的select才创建快照,而不是在第一次select ... for update时就创建read viw

上面其实已经提到了几个关键信息:

  1. 在RR隔离级别下,遇到第一个普通SELECT才会开始创建read view。而如果SELECT ... FOR UPDATE/FOR SHARE这样的,叫做当前读或加锁读,这种是不会创建read view的
  2. 即便是 innodb_locks_unsafe_for_binlog=1 的时候,在RR隔离级别下,事务中第一个普通SELECT创建的快照在整个事务过程中依然有效,这个选项的作用只是禁用了gap lock,并不会影响RR级别的其他行为
  3. 发起事务时,如果加上with consistent snapshot会立即创建read view,和事务启动后立刻发起普通SELECT相同效果
  4. 在RC隔离级别下,还是每次普通SELECT都会重新创建read view

好了,就酱。Enjoy MySQL :)

相关文章
|
2天前
|
人工智能 弹性计算 运维
|
23天前
|
Linux 程序员 数据格式
【2026最新】Notepad++下载、安装和使用一篇搞定(附中文版安装包)
Notepad++ 是一款免费开源、轻量高效的 Windows 文本编辑器,支持 C/Python/HTML 等 80+ 语言语法高亮、代码折叠、正则替换、编码转换及插件扩展,专为程序员与文本处理用户打造,完美替代系统记事本。(239字)
|
8天前
|
人工智能 缓存 安全
Claude Code 封号真实原因曝光,这次彻底不装了,直接针对国内开发者的账号下手?
Claude Code 封号潮背后:逆向扒出客户端隐写区域标记,Anthropic 政策收紧叠加 DeepSeek 7 月涨价,国产替代更紧迫。
|
14天前
|
人工智能 JSON 自然语言处理
让教学更智慧:用阿里云百炼工作流,自动生成中小学教材内容#小有可为#有温度的AI
通过可视化工作流编排,将大模型推理能力转化为标准化的教学内容生成引擎。教师只需输入教材标题和适用学段,即可自动获得结构完整、符合课程标准的章节内容,大幅降低备课门槛,助力教育资源均衡化。
501 127
|
18天前
|
存储 人工智能 监控
QoderWork完全指南:从入门到精通,把“AI实习生”变成你的全能工作搭档
阿里云2026年推出的桌面端AI工作助手QoderWork,不止聊天,更可动手干活:本地运行、安全可控,支持文件整理、数据分析、PPT生成、网页开发等;内置专家套件、多Agent协作与自定义Skills,让AI真正成为你身边的“AI实习生”。
|
7天前
|
人工智能 编解码 物联网
2026 最新Stable Diffusion 本地部署教程 下载安装使用详细图解(含官网安装包)
Stable Diffusion(SD)是2022年发布的开源文生图模型,由Stability AI等联合开发。支持文生图、图生图、局部重绘等,依托VAE降低算力需求,可在消费级显卡运行。本文提供秋葉aaaki制作的Windows整合包(含图形界面与插件),开箱即用,零配置启动。
|
9天前
|
人工智能 安全 程序员
终于,Claude Code 封号的原因被曝光了!竟然针对中国用户,植入隐形代码?!
通俗易懂地揭秘 Claude Code 封号的手段,分享一些自己对 AI 编程困境的思考,Codex、Cursor、DeepSeek、智谱 GLM、甚至是豆包,都有所行动了
492 1
|
10天前
|
人工智能 安全 Cloud Native
Higress 新发布:AI Gateway 能力增强,Gateway API 及其推理扩展持续打磨
增强 AI 网关能力,持续打磨 Gateway API 及其推理扩展。
411 125
|
17天前
|
人工智能 弹性计算 API
什么是 AlibabaCloud Agent Toolkit
Alibaba Cloud Agent Toolkit 是面向AI Agent的阿里云智能工具套件,集成OpenAPI、Terraform、CLI与文档能力,提供MCP插件、场景化Skills及执行审计机制,助AI准确查API、生成代码、规划架构、校验部署,实现安全、可靠、可追溯的云上智能运维。
436 2