gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:05:43 28 4
gpt4 key购买 nike

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

我的情况:

我有一个包含 50000 行的表,其中有很多更新(每行都有 View )。 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

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

关于mysql - COUNT(*) 是否等待 InnoDB 中的行锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26973483/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com