我有一个MYISAM表,在其上执行长时间运行的SELECT语句。这些语句是否会导致正在读取的表的锁定?如果是这样,你如何阻止锁定发生?
根据https://dev.mysql.com/doc/refman/5.7/en/internal-locking.html:
MySQL对MyISAM,MEMORY和MERGE表使用表级锁定, 只允许一个会话一次更新这些表。这个 锁定级别使这些存储引擎更适合于只读, 读取主要或单用户应用程序。
这是否也意味着SELECT
语句会创建锁定?
答案 0 :(得分:4)
这些[长时间运行的SELECT]语句是否会导致正在读取的表的锁定?
是。在读取MyISAM表时无法更新。如果表上有长时间运行的读(即SELECT)查询,则任何UPDATE或DELETE查询都必须等到读取查询完成。
(INSERT查询有时异常。只要表结构中没有内部漏洞,就可以允许编写者在表的末尾插入一行而不获取锁但是,如果有任何行被更新或删除,这可能会产生漏洞,这也需要INSERT查询来获取写锁。)
有关内部的更多信息,请阅读table-level locks。但问题的短期和长期是,如果并发是一个问题,你可能不应该使用MyISAM。