假设我有两个用户试图按以下顺序访问数据库中名为“comments”的表:
User1 正在创建和更新 id = 10 的记录
更新评论 SET comment="Hello World"WHERE id=10
User2 正在选择同一表格注释的所有行
从评论中选择 *
我想讨论以下几种情况的区别:
- 如果表的引擎是 MyISAM :更新查询将锁定 整个表,它将对选择查询进行排队,直到更新 该行完成,然后它将被执行,这将停止任何 用户从该表中询问任何内容,直到更新 完成。
- 如果表的引擎是 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/