【问题标题】:Understanding the InnoDB and its isolation level and locking了解 InnoDB 及其隔离级别和锁定
【发布时间】:2013-12-09 19:49:52
【问题描述】:

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

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

用户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;

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

【问题讨论】:

  • 没有。如果插入另一行,innodb 没有理由锁定表以进行读取。只需在 2 个不同的终端中打开 2 个连接并运行您的场景
  • 我试过了,我问这个问题没用
  • “没有工作”是什么意思?
  • 我在我的问题中提到任何更新或插入操作都会停止任何选择,直到它完成。为此,我试图弄清楚为什么?考虑到我的问题中的步骤和搜索

标签: mysql sql innodb isolation-level mvcc


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 2021-01-27
    • 2015-08-04
    • 2018-06-27
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多