2014-11-17 40 views
2

即使对于诸如SELECT COUNT(*) FROM t的查询,MySQL InnoDB表是否仍在等待写锁定?COUNT(*)是否等待InnoDB中的行锁?

我的情况:

我有表50000行有许多更新(意见每一行计数)。 InnoDB应该在更新的行上写入锁定。但是当我在这张表上只有COUNT(*)的查询时,即使没有等待写入锁,MySQL也可以回答这个查询,因为没有UPDATE会改变行数。

非常感谢!

回答

2

不,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)。所有细节都在上面的链接中解释。

+0

好的,所以只是为了确保:UPDATE中没有行锁定,会阻止SELECT COUNT(*)?因此,基本上每个时刻至少可以更新1行,并且SELECT查询仍然可以正常执行(在可重复读取隔离级别的情况下)?谢谢! – koubic

+0

是的,包括选择计数(*)在内的普通选择不会被更新阻止。 – krokodilko