繁体   English   中英

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

[英]MySQL MyISAM how to perform a read without locking a table?

我的问题是对这个答案的跟进 我想了解如何在不使用MyISAM引擎锁定表的情况下执行select语句。

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

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
COMMIT ;

这是MyISAM表的默认行为。 如果实际上想要锁定MyISAM表,则必须手动获取表级锁。 事务隔离级别, START TRANSACTIONCOMMITROLLBACK对MyISAM表行为没有影响,因为MyISAM不支持事务

更多关于内部锁定机制

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

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

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

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


* 但是,由于这个聪明的伎俩,并不总是需要这些锁:

MyISAM存储引擎支持并发插入以减少给定表的读取器和写入器之间的争用:如果MyISAM表在数据文件的中间没有空闲块,则总是在数据文件的末尾插入行。 在这种情况下,您可以自由地为没有锁的MyISAM表混合并发INSERTSELECT语句。

SELECT期间,MyISAM确实使用了读锁定。 表格末尾INSERT可以解决这个问题。

但是在长时间运行的SELECT正在进行时尝试执行UPDATEDELETEALTER TABLE 反之亦然,在对该表的更改运行时从表中读取。 它是先到先得的,后来的线程阻塞直到第一个线程完成。

MyISAM对事务没有任何支持,因此它必须以这种方式工作。 如果SELECT从表中读取行,并且并发线程更改了某些行,则会出现争用情况。 SELECT可能会在更改之前读取某些行,并在更改之后读取某些行,从而导致数据的完全混合视图。

使用SET TRANSACTION ISOLATION LEVEL执行的任何操作都不会对MyISAM产生任何影响。

出于这些原因,建议使用InnoDB。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM