【发布时间】:2013-12-09 19:49:52
【问题描述】:
我在 MySQL 数据库中有一个带有 InnoDB 引擎 (cmets) 的表,我有以下场景:
有两个用户试图同时访问同一个 cmets 表,如下所示:
用户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;
最大的问题是当其他用户插入或更新行时,我的用户如何阅读?
【问题讨论】:
-
没有。如果插入另一行,innodb 没有理由锁定表以进行读取。只需在 2 个不同的终端中打开 2 个连接并运行您的场景
-
我试过了,我问这个问题没用
-
“没有工作”是什么意思?
-
我在我的问题中提到任何更新或插入操作都会停止任何选择,直到它完成。为此,我试图弄清楚为什么?考虑到我的问题中的步骤和搜索
标签: mysql sql innodb isolation-level mvcc