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

时间:2013-11-25 07:42:15

标签: mysql sql innodb isolation-level mvcc

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

有两个用户试图同时访问同一个评论表:

用户1:

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

用户2:

SELECT * FROM comments;

我希望澄清以下几点:

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

    • 我想提一下,我使用上面的代码,但仍然会出现同样的问题(等待问题):

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

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

1 个答案:

答案 0 :(得分:0)

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

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