停止MYISAM表的表锁

时间:2017-07-04 00:01:36

标签: mysql multithreading myisam

我有一个MYISAM表,在其上执行长时间运行的SELECT语句。这些语句是否会导致正在读取的表的锁定?如果是这样,你如何阻止锁定发生?

根据https://dev.mysql.com/doc/refman/5.7/en/internal-locking.html

  

MySQL对MyISAM,MEMORY和MERGE表使用表级锁定,   只允许一个会话一次更新这些表。这个   锁定级别使这些存储引擎更适合于只读,   读取主要或单用户应用程序。

这是否也意味着SELECT语句会创建锁定?

1 个答案:

答案 0 :(得分:4)

  

这些[长时间运行的SELECT]语句是否会导致正在读取的表的锁定?

是。在读取MyISAM表时无法更新。如果表上有长时间运行的读(即SELECT)查询,则任何UPDATE或DELETE查询都必须等到读取查询完成。

(INSERT查询有时异常。只要表结构中没有内部漏洞,就可以允许编写者在表的末尾插入一行而不获取锁但是,如果有任何行被更新或删除,这可能会产生漏洞,这也需要INSERT查询来获取写锁。)

有关内部的更多信息,请阅读table-level locks。但问题的短期和长期是,如果并发是一个问题,你可能不应该使用MyISAM。