即使对于诸如SELECT COUNT(*) FROM t
的查询,MySQL InnoDB表是否仍在等待写锁定?COUNT(*)是否等待InnoDB中的行锁?
我的情况:
我有表50000行有许多更新(意见每一行计数)。 InnoDB应该在更新的行上写入锁定。但是当我在这张表上只有COUNT(*)
的查询时,即使没有等待写入锁,MySQL也可以回答这个查询,因为没有UPDATE
会改变行数。
非常感谢!
即使对于诸如SELECT COUNT(*) FROM t
的查询,MySQL InnoDB表是否仍在等待写锁定?COUNT(*)是否等待InnoDB中的行锁?
我的情况:
我有表50000行有许多更新(意见每一行计数)。 InnoDB应该在更新的行上写入锁定。但是当我在这张表上只有COUNT(*)
的查询时,即使没有等待写入锁,MySQL也可以回答这个查询,因为没有UPDATE
会改变行数。
非常感谢!
不,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,阅读提交和可重复读取模式下,所有只读取数据(没有FOR UPDATE或LOCK IN SHARE MODE分类的SELECT语句)以非锁定方式执行。
模式所有transacions都被序列化,并且根据自动提交模式,当与其他事务冲突时(当autocommit = true时),或者自动转换为SELECT ... LOCK IN SHARE MODE(当自动提交时= FALSE)。所有细节都在上面的链接中解释。
好的,所以只是为了确保:UPDATE中没有行锁定,会阻止SELECT COUNT(*)?因此,基本上每个时刻至少可以更新1行,并且SELECT查询仍然可以正常执行(在可重复读取隔离级别的情况下)?谢谢! – koubic
是的,包括选择计数(*)在内的普通选择不会被更新阻止。 – krokodilko