COUNT(*)是否等待InnoDB中的行锁?

时间:2014-11-17 13:10:50

标签: mysql locking innodb database-performance

即使是SELECT COUNT(*) FROM t等查询,MySQL InnoDB表是否等待写锁定?

我的情况:

我有50000行的表,有许多更新(每行中的视图数)。 InnoDB应该在更新的行上写入锁定。但是当我在这个表上只用COUNT(*)进行查询时,MySQL甚至可以在不等待写锁的情况下回答这个查询,因为没有UPDATE会改变行数。

非常感谢!

1 个答案:

答案 0 :(得分:4)

不,MySql不会为仅从表中读取数据的查询锁定InnoDb表 这只是旧MyIsam表的情况,所有读者必须等到作者完成,反之亦然。

对于InnoDb表,他们实施了Multiversion concurrency control

在MySql术语中,它被称为Consistent Nonlocking Reads

简而言之 - 当阅读器启动查询时,数据库会在查询启动时的某个时间点生成数据库的快照,而阅读器(查询)只会看到所做的更改到目前为止可见(提交),但看不到后续事务所做的更改。这允许读者在不锁定和等待作者的情况下读取数据,但仍然保持ACID

根据事务隔离级别存在细微差别,您可以在此处找到详细说明:http://dev.mysql.com/doc/refman/5.6/en/set-transaction.html

简而言之 - 在读取uncommited 读取提交可重复读取模式,所有只读取数据的SELECT语句(没有FOR UPDATE或LOCK IN SHARE MODE clasues的SELECT)以非锁定方式执行 在 serializable 模式下,所有transacions都被序列化,并且根据自动提交模式,SELECT可以在与其他事务冲突时(当autocommit = true时)被阻止,或者自动转换为SELECT ... LOCK IN SHARE MODE (当autocommit = false时)。所有细节都在上面的链接中解释。