假设我有一个非常大的表,SELECT *查询占用时间超过5分钟(在示例中夸大),并且在运行时,表的第一行会发生UPDATE。如果全局隔离级别是READ_REPLICATED,那是否会使UPDATE等待完整的SELECT查询读取所有行?在SELECT运行时,第二个事务是否可以在表中插入INSERT?
答案 0 :(得分:1)
我无法写评论,所以我必须在这里写。 Psi用户在评论中声称:
无论隔离级别如何,当在表上运行读取时,表都会被锁定以进行写操作
这是错误的,至少在InnoDB表上,当隔离级别为REPEATABLE READ时。从手册(https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html):
一致读取是InnoDB在READ COMMITTED和REPEATABLE READ隔离级别中处理SELECT语句的默认模式。一致读取不会在它访问的表上设置任何锁,因此其他会话可以自由地在对表执行一致读取的同时修改这些表。
所以,对你的问题:
比方说,我有一个非常大的表,这样SELECT *查询要花费5分钟以上的时间(示例夸大了),并且在运行时,UPDATE在表的第一行发生。如果全局隔离级别为READ_REPLICATED,这是否会使UPDATE等待完整的SELECT查询读取所有行?
如果您的意思是可重复读取,那么不会。 SELECT为您提供SELECT启动时表中数据的快照。如果另一个会话在查询期间执行UPDATE修改SELECT不会看到的更改,它将为您提供“旧”值。
第二个事务可以在SELECT运行时对表进行INSERT操作吗?
是的