use*_*948 1 mysql multithreading myisam
我有一个 MYISAM 表,在该表上执行了长时间运行的 SELECT 语句。这些语句是否会导致正在读取的表上的锁?如果是这样,您如何阻止锁定发生?
根据https://dev.mysql.com/doc/refman/5.7/en/internal-locking.html:
MySQL 对 MyISAM、MEMORY 和 MERGE 表使用表级锁定,一次只允许一个会话更新这些表。这种锁定级别使这些存储引擎更适合只读、多读或单用户应用程序。
这是否也意味着SELECT语句会创建锁?
小智 5
这些 [长时间运行的 SELECT] 语句是否会导致正在读取的表上的锁?
是的。MyISAM 表在读取时无法更新。如果对表进行长时间运行的读取(即 SELECT)查询,则任何 UPDATE 或 DELETE 查询都必须等到读取查询完成。
(INSERT 查询有时是一个例外。只要表结构中没有内部漏洞,就可以允许写入者在表的末尾插入一行而无需获得锁。但是,如果任何行被更新或删除,这可能会产生漏洞,这也需要 INSERT 查询来获取写锁。)
有关内部结构的更多信息,请阅读表级锁。但总而言之,如果担心并发性,您可能不应该使用 MyISAM。