在MySQL数据库中,InnoDB引擎的行级锁和MyISAM引擎的表级锁之间的区别需要澄清。

14
假设我有两个用户按照以下顺序尝试访问数据库中名为“comments”的表:
1. User1正在更新id = 10的记录 UPDATE comments SET comment="Hello World" WHERE id=10 2. User2正在选择同一张表comments的所有行 SELECT * FROM comments
我想讨论以下情况的不同之处:
1. 如果表的引擎是MyISAM:更新查询将锁定整个表,从而使选择查询排队等待,直到行的更新完成,然后才会执行以停止任何用户从此表请求任何内容,直到更新完成。 2. 如果表的引擎是InnoDB:更新查询将锁定更新的行。
我想知道这种锁如何影响选择查询?例如,如果选择查询要求数据库返回comments表的全部记录并发现其中一个记录(id = 10)被锁定,那么数据库是否会再次将选择查询排队等待更新完成?
如果是,那么两种引擎之间有什么区别?
如果没有,那么我想说,即使我将表的引擎从MyISAM更改为InnoDB,但在进行更新或插入查询时排队任何请求的问题仍然存在。
对于这种情况的任何解释都将非常有帮助。先谢谢您了。

在您的示例中,选择语句必须等待两个引擎的更新完成。如果选择查询不包括ID为10的记录(由更新锁定),则情况将不同,在这种情况下,MyISAM选择必须等待,但InnoDB不必等待。 "InnoDB中的此功能称为并发" - https://dev59.com/73VD5IYBdhLWcg3wU52G#28070969 - Gerard Roche
2个回答

1
在InnoDB中,这取决于事务是否启用。InnoDB具有MVCC功能,这意味着当线程1正在更新时,线程2可以无需锁定进行读取。
这里已经回答了InnoDB的行锁定与MVCC非阻塞读取相同吗? 如果禁用事务,与MyISAM相同吗?我想是的,但不确定。

我的所有表都已更改为InnoDB,但是表可能是InnoDB而事务被禁用吗?如果是的话,我该如何找出是否已禁用以及如何启用它? - Basel
@Basel 我的意思是,如果关闭自动提交,则当前连接的事务将被禁用。要使用事务,请执行以下操作:“SET autocommit = 0; START TRANSACTION; UPDATE .... ; COMMIT;” - Jason Heo

0
在您的情况下,如果未更新id=10的行,则Innodb中的select查询结果将返回旧数据。结果不会停止。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接