0

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

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

用户1:

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

用户2:

SELECT * FROM comments;

我想澄清以下几点,请:

  1. user2 无法从表中读取(SELECT),它应该等待一段时间(我认为直到 user1 的插入完成)。这种等待是 InnoDB 使用的称为行级锁的吗?
  2. 如果上一个问题的答案是肯定的,那么MVCC 的工作是什么?在 InnoDB 引擎中。我读到 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;

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

4

1 回答 1

0

您正在从表中选择所有内容,因此行级锁对您根本没有帮助,因为您要求所有行。添加“where id = 5”或类似的东西,一切都很好。

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

于 2013-11-26T08:54:03.453 回答