[英]MySQL MyISAM how to perform a read without locking a table?
这是MyISAM表的默认行为。 如果实际上想要锁定MyISAM表,则必须手动获取表级锁。 事务隔离级别, START TRANSACTION
, COMMIT
, ROLLBACK
对MyISAM表行为没有影响,因为MyISAM不支持事务 。
更多关于内部锁定机制
在执行SELECT
语句之前隐式获取READ锁,并在执行SELECT
语句之后释放READ锁。 请注意,几个并发的,同时的SELECT
语句可能同时运行,因为多个会话可能在同一个表上保持READ锁定。
相反,在执行INSERT
或UPDATE
或DELETE
语句之前,会隐式获取WRITE锁。 这意味着只要写入正在进行*就不会发生读取(更不用说并发写入)。
以上内容仅适用于MyISAM,MEMORY和MERGE表。
您可能想在此处阅读更多相关信息:
* 但是,由于这个聪明的伎俩,并不总是需要这些锁:
MyISAM
存储引擎支持并发插入以减少给定表的读取器和写入器之间的争用:如果MyISAM
表在数据文件的中间没有空闲块,则总是在数据文件的末尾插入行。 在这种情况下,您可以自由地为没有锁的MyISAM
表混合并发INSERT
和SELECT
语句。
在SELECT
期间,MyISAM确实使用了读锁定。 表格末尾的INSERT
可以解决这个问题。
但是在长时间运行的SELECT
正在进行时尝试执行UPDATE
, DELETE
或ALTER TABLE
。 反之亦然,在对该表的更改运行时从表中读取。 它是先到先得的,后来的线程阻塞直到第一个线程完成。
MyISAM对事务没有任何支持,因此它必须以这种方式工作。 如果SELECT
从表中读取行,并且并发线程更改了某些行,则会出现争用情况。 SELECT
可能会在更改之前读取某些行,并在更改之后读取某些行,从而导致数据的完全混合视图。
使用SET TRANSACTION ISOLATION LEVEL
执行的任何操作都不会对MyISAM产生任何影响。
出于这些原因,建议使用InnoDB。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.