即使是SELECT COUNT(*) FROM t
等查询,MySQL InnoDB表是否等待写锁定?
我的情况:
我有50000行的表,有许多更新(每行中的视图数)。 InnoDB应该在更新的行上写入锁定。但是当我在这个表上只用COUNT(*)
进行查询时,MySQL甚至可以在不等待写锁的情况下回答这个查询,因为没有UPDATE
会改变行数。
非常感谢!
答案 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时)。所有细节都在上面的链接中解释。