gpt4 book ai didi

mysql - 了解 InnoDB 及其隔离级别和锁定

转载 作者:行者123 更新时间:2023-11-30 01:00:22 25 4
gpt4 key购买 nike

我在 MySQL 数据库中有一个带有 InnoDB 引擎(注释)的表,并且有以下场景:

有两个用户尝试同时访问同一个评论表,如下所示:

用户1:

INSERT INTO comments (comment) VALUES ('HELLO WORLD');

用户2:

SELECT * FROM comments;

我希望澄清以下几点:

  1. user2无法从表中读取(SELECT),它应该等待一段时间(我认为直到user1的插入完成)。 这个等待是InnoDB使用的行级锁吗?
  2. 如果上一个问题的答案是"is",那么 InnoDB 引擎中的 MVCC 的作用是什么?。我读到MVCC意味着让用户读取表行(可重复读取),即使同时存在更新或插入情况(因为这里的用户读取该行的旧版本,即使它正在更新)平均时间)。

注释:

  • 我想提一下,我按以下形式使用上述代码,但它仍然出现相同的问题(等待问题):

用户1:

SET AUTOCOMMIT=0;
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
INSERT INTO comments (comment) VALUES ('HELLO WORLD');
COMMIT;

用户2:

SELECT * FROM comments;
  • 我什至尝试将隔离级别从可重复读更改为未提交读 - 脏读在我的情况下并不那么重要 - (我以为这会解决等待问题,但事实并非如此。等待仍然存在) .

用户1:

SET AUTOCOMMIT=0;
START TRANSACTION;
INSERT INTO comments (comment) VALUES ('HELLO WORLD');
COMMIT;

用户2:

SELECT * FROM comments;

最大的问题是当其他用户插入或更新行时我的用户如何阅读?

最佳答案

您正在从表中选择所有内容,因此当您请求所有行时,行级锁根本无法帮助您。添加“where id = 5”或类似的内容,一切都很好。

在这里您可以找到不同锁定机制的一些解释: http://dev.mysql.com/doc/refman/5.0/en/internal-locking.html

关于mysql - 了解 InnoDB 及其隔离级别和锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20187095/

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