我在 MySQL 数据库中有一个带有 InnoDB 引擎(评论)的表,我有以下场景:
有两个用户试图同时访问同一个评论表,如下所示:
用户1:
INSERT INTO comments (comment) VALUES ('HELLO WORLD');
用户2:
SELECT * FROM comments;
我想澄清以下几点,请:
- user2 无法从表中读取(SELECT),它应该等待一段时间(我认为直到 user1 的插入完成)。这种等待是 InnoDB 使用的称为行级锁的吗?
- 如果上一个问题的答案是肯定的,那么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;
最大的问题是当其他用户插入或更新行时,我的用户如何阅读?