# 加上排他锁 select * from t forupdate; # 加上共享锁 select * from t forlockinsharemode;
可以发现,当前读的这两种写法,在查询过程中都是需要加锁的,因此它们能读取到最新的数据。
「需要说明的是,在 MySQL 可重复读隔离级别下,幻读问题确实不存在。但是 MVCC 机制解决的是快照读的幻读问题,并不能解决当前读的幻读问题。当前读的幻读问题是通过间隙锁解决的,至于什么是间隙锁,以后的文章中会介绍,有兴趣的读者可以自己去了解。」
因此,「本文的后半部分,全部是基于快照读来进行解释的」。
如何解决幻读
假设现在表 t 中只有一条数据,数据内容中,主键 id=1,隐藏的 trx_id=10,它的 redo log 如下图所示。
假设现在有事务 A 和事务 B 并发执行,事务 A 的事务 id 为 20,事务 B 的事务 id 为 30。
现在事务 A 开始第一次查询数据,查询的 SQL 语句如下。
select * fromwhereid >= 1;
在开始查询之前,MySQL 会为事务 A 产生一个 ReadView,此时 ReadView 的内容如下:m_ids=[20,30],min_trx_id=20,max_trx_id=31,creator_trx_id=20。
由于此时表 t 中只有一条数据,且符合 where id>=1 条件,因此会查询出来。「然后通过 ReadView 机制,发现该行数据的 row_id=10,小于事务 A 的 ReadView 里 min_trx_id,这表示这条数据是事务 A 开启之前,其他事务就已经提交了的数据,因此事务 A 可以读取到。」
Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。
Sublime Text
Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。