mysql - 澄清 InnoDB 引擎中的行级锁和 MySQL 数据库中 MyISAM 引擎中的表级锁的区别

标签 mysql sql database performance innodb

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

  1. User1 正在创建和更新 id = 10 的记录

    更新评论 SET comment="Hello World"WHERE id=10

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

    从评论中选择 *

我想讨论以下几种情况的区别:

  1. 如果表的引擎是 MyISAM :更新查询将锁定 整个表,它将对选择查询进行排队,直到更新 该行完成,然后它将被执行,这将停止任何 用户从该表中询问任何内容,直到更新 完成。
  2. 如果表的引擎是 InnoDB :更新查询将锁定更新的行。

我想知道这个锁是如何影响 SELECT 查询的???

我的意思是,如果 select 向数据库询问 comments 表的全部记录并发现其中一个 (id =10 ) 被锁定,数据库是否会再次将 select 查询排队,直到更新完成?

如果是,那么这两个引擎有什么区别??

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

对这种情况的任何解释都会很有帮助。提前谢谢你

最佳答案

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

这里已经回答了 InnoDB's row locking the same as MVCC Non-Blocking Reads?

如果事务被禁用,与 MyISAM 一样吗?我想是的,但不确定。

关于mysql - 澄清 InnoDB 引擎中的行级锁和 MySQL 数据库中 MyISAM 引擎中的表级锁的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20173670/

相关文章:

php - Laravel 从数据库加载设置

mysql - Buggy 加入 CodeIgniter ActiveRecord

php - Grocery CRUD 连接表

php - 我应该使用纯 PHP/MySQL 来开发 Web 应用程序吗?

mysql - SQL SELECT 子句列添加行?

neo4j 查找谁在某人出演的所有电影中扮演过角色

php - 在mysql中用where子句添加时间差

MYSQL 错误号 121。支持事务、行级锁定和外键

sql - plsql使用一个立即执行命令插入多行

mysql - 选择操作期间出现不明确的列名错误