澄清InnoDB引擎中的行级锁定与MySQL数据库中MyISAM引擎中的表级锁定之间的区别

时间:2013-11-24 10:51:03

标签: mysql sql database performance innodb

我们假设我有两个用户尝试按以下顺序访问数据库中名为“comments”的表:

  1. User1正在为id = 10

    的记录制作和更新

    更新注释SET comment =“Hello World”WHERE id = 10

  2. User2正在为同一个表注释的所有行进行选择

    SELECT * FROM comments

  3. 我想讨论以下案例之间的区别:

    1. 如果表的引擎是MyISAM:Update查询将锁定 整个表将排队选择查询,直到更新 该行已完成,然后将执行该操作将停止任何操作 用户从此表中询问任何内容,直到更新为止 结束。
    2. 如果表的引擎是InnoDB:更新查询将锁定更新的行。
    3. 我想知道这个锁定如何影响SELECT QUERY ???

      我的意思是如果select询问数据库注释表的整个记录​​,发现其中一个(id = 10)被锁定,数据库是否会再次对select查询进行排队,直到更新完成?

      如果是,则两个引擎之间有什么区别??

      如果不是我想说我的网站上面有相同的情况,甚至我将我的表引擎从MyISAM更改为InnoDB,但是在发生更新或插入查询时仍然会出现排队任何请求的问题。

      对这种情况的任何解释都会非常有用。提前谢谢你

2 个答案:

答案 0 :(得分:1)

在InnoDB中,它取决于是否启用了事务。 InnoDB具有MVCC功能,这意味着当线程1正在更新时,线程2可以无锁地读取。

这已经在InnoDB's row locking the same as MVCC Non-Blocking Reads?

回答了

如果禁用交易,与MyISAM相同?我想是的但不确定。

答案 1 :(得分:0)

在你的场景中的Innodb中,结果将来自select查询,但是如果没有更新,则id为10的行的旧数据。结果不会停止。