MySQL并发SELECT,INSERT,UPDATE

时间:2017-10-30 20:41:33

标签: mysql

假设我有一个非常大的表,SELECT *查询占用时间超过5分钟(在示例中夸大),并且在运行时,表的第一行会发生UPDATE。如果全局隔离级别是READ_REPLICATED,那是否会使UPDATE等待完整的SELECT查询读取所有行?在SELECT运行时,第二个事务是否可以在表中插入INSERT?

1 个答案:

答案 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操作吗?

是的