我的问题是对这个答案的跟进. 我想了解如何在不使用MyISAM引擎锁定表的情况下执行select语句.
如果你有InnoDB而不是MyISAM,答案陈述如下.MyISAM引擎的等价物是什么?
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
COMMIT ;
Run Code Online (Sandbox Code Playgroud)
Ran*_*eed 11
这是MyISAM表的默认行为.如果实际上想要锁定MyISAM表,则必须手动获取表级锁.事务隔离级别START TRANSACTION,COMMIT,ROLLBACK对MyISAM表的行为没有影响,因为MyISAM不支持事务.
更多关于内部锁定机制
在执行SELECT语句之前隐含地获取READ锁,并且在执行语句之后释放READ锁.请注意,几个并发的同时SELECT语句可能同时运行,因为多个会话可能在同一个表上保持READ锁定.
相反,写锁隐含的执行收购前INSERT或UPDATE或DELETE声明.这意味着只要写入正在进行*就不会发生读取(更不用说并发写入).
以上内容仅适用于MyISAM,MEMORY和MERGE表.
您可能想在此处阅读更多相关信息:
* 但是,由于这个聪明的伎俩,并不总是需要这些锁:
该
MyISAM存储引擎支持并发插入,减少读者和作者之间的竞争给定表:如果一个MyISAM表有数据文件的中间没有空闲块,行总是在数据文件的末尾插入.在这种情况下,您可以自由地混合没有锁的表的并发INSERT和SELECT语句MyISAM.
MyISAM确实在使用期间使用了读锁定SELECT.一个INSERT在表的末尾可以得到解决的.
但是尝试做一个UPDATE,DELETE或者ALTER TABLE在长时间运行SELECT的过程中.反之亦然,在对该表的更改运行时从表中读取.它是先到先得的,后来的线程阻塞直到第一个线程完成.
MyISAM对事务没有任何支持,因此它必须以这种方式工作.如果a SELECT正在从表中读取行,并且并发线程会更改其中一些行,则会出现竞争条件.所述SELECT可改变之后读一些改变之前的行的,并且行的一些,从而导致数据的完全混合放大图.
你做的任何事情SET TRANSACTION ISOLATION LEVEL对MyISAM都没有影响.
出于这些原因,建议使用InnoDB.
| 归档时间: |
|
| 查看次数: |
17598 次 |
| 最近记录: |