MySQL MyISAM如何在不锁定表的情况下执行读取?

我的问题是对this answer.的跟进我想知道如何在不使用MyISAM引擎锁定表的情况下执行select语句.

如果你有InnoDB而不是MyISAM,答案陈述如下. MyISAM引擎的等价物是什么?

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
COMMIT ;
最佳答案
这是MyISAM表的默认行为.如果实际上想要锁定MyISAM表,则必须手动获取表级锁.事务隔离级别,START TRANSACTION,COMMIT,ROLLBACK对自MyISAM does not support transactions以来的MyISAM表行为没有影响.

更多关于内部锁定机制

在执行SELECT语句之前隐式获取READ锁,并在执行SELECT语句之后释放READ锁.请注意,几个并发的,同时的SELECT语句可能同时运行,因为多个会话可能在同一个表上保持READ锁定.

相反,在执行INSERT或UPDATE或DELETE语句之前,会隐式获取WRITE锁.这意味着只要写入正在进行*就不会发生读取(更不用说并发写入).

以上内容仅适用于MyISAM,MEMORY和MERGE表.

您可能想在此处阅读更多相关信息:

> Internal locking methods
> Read vs Write locks

*但是,由于this clever trick,并不总是需要这些锁:

The MyISAM storage engine supports concurrent inserts to reduce contention between readers and writers for a given table: If a MyISAM table has no free blocks in the middle of the data file, rows are always inserted at the end of the data file. In this case, you can freely mix concurrent INSERT and SELECT statements for a MyISAM table without locks.

转载注明原文:MySQL MyISAM如何在不锁定表的情况下执行读取? - 代码日志