InnoDB MySQL 选择查询锁定

Sta*_*ack 2 mysql innodb

我有可重复读取的隔离级别,并且正在执行: Select * From example查询。我在https://dev.mysql.com/doc/refman/5.7/en/innodb-locks-set.html中读到, select...from 查询使用来自快照的一致读取,因此不对行或表设置锁定。这是否意味着,即使修改不会显示在选择结果中,在选择之后但选择查询结束之前启动的更新、插入或删除仍然能够运行?

Bil*_*win 5

是的,当现有事务保存数据的可重复读取快照时,您可以更新/插入/删除。

这是通过多版本并发控制或 MVCC 实现的。

这是一种奇特的说法,即 RDBMS 保留同一行的多个版本,以便可重复读取快照可以根据需要继续读取旧版本(即,只要其事务快照存在) 。

如果存在由事务启动后提交的事务创建的行版本,则您应该无法看到该行版本。每个行版本在内部都保留一些有关创建它的事务的元数据,并且每个事务都知道如何使用它来确定它是否应该看到行版本。

最终,所有可能对旧行版本感兴趣的事务都会完成,MVCC 可以“清理”过时的行版本。