MySQL InnoDB表是否等待写锁,甚至等待查询(如SELECT COUNT(*) FROM t )
我的处境:
我有50000行的表,有很多更新(每一行都有视图)。InnoDB应该在更新的行上设置一个写锁。但是,当我在这个表上只使用COUNT(*)进行查询时,即使不用等待写锁,MySQL也可以回答这个查询,因为没有UPDATE会更改行数。
非常感谢!
发布于 2014-11-18 01:43:23
不,对于只从表中读取数据的查询,MySql不锁定InnoDb表。
这只是旧的MyIsam表的情况,所有的读取器都必须等待写入器完成,反之亦然。
对于InnoDb表,他们实现了多版本并发控制
在MySql术语中,它被称为一致非锁定读取
简而言之,当读取器启动查询时,数据库会在查询启动的某个时间点对数据库进行快照,而读取器(查询)只会看到到此时为止可见的更改(已完成),但不会看到以后的事务所做的更改。这允许读取器读取数据,而无需锁定和等待写入器,但仍然保留酸。
根据事务隔离级别的不同,有细微的差异,您可以在这里找到详细的描述:http://dev.mysql.com/doc/refman/5.6/en/set-transaction.html
简而言之,所有只读取数据的SELECT语句(SELECT不用于更新或锁定共享模式类)都以非锁定方式执行。
在可序列化模式下,所有的transacions都是序列化的,根据自动提交模式,当与其他事务发生冲突时(当autocommit=true)或自动转换为SELECT时,SELECT可以被阻塞。锁定共享模式(当autocommit=false)。所有细节都在上面的链接中解释。
https://stackoverflow.com/questions/26973483
复制相似问题