insert into test.qvalues
select * from qcvalues.qvalues;
我想知道上面的行是否锁定数据库VALUES
答案 0 :(得分:4)
对我来说,文档有点不清楚:
Internal Locking Methods表明,在某些情况下,可以在另一个会话正在读取时插入MyISAM表:
MyISAM存储引擎支持 并发插入减少 读者和作家之间的争论 对于给定的表:如果是MyISAM表 中间没有空闲区块 数据文件,行总是 插入数据文件的末尾。 在这种情况下,您可以自由混合 并发INSERT和SELECT 没有的MyISAM表的语句 锁。也就是说,您可以插入行 同时进入MyISAM表 其他客户正在阅读它。 孔可以来自行 从中间删除或更新 的表。如果有洞, 并发插入被禁用但是 当自动再次启用时 所有洞都填满了新的 数据
但是,Table Locking Issues显示表格将被锁定直到SELECT完成(这符合您的情况):
表锁定也是不利的 以下场景:
- 会话发出需要很长时间才能运行的SELECT。
- 然后另一个会话在同一个表上发出UPDATE。本次会议 等待SELECT完成。
- 另一个会话在同一个表上发出另一个SELECT语句。 因为UPDATE具有更高的优先级 比SELECT,这个SELECT等待 在等待之后更新完成 第一个完成的选择。
InnoDB表实现了行级锁,因此只有被读取的行才会被锁定,而不是整个表。
我没有依赖文档,而是尝试了一些测试:
table_a
和table_b
。table_a
填入500,000行。table_a
声明将数据从table_b
复制到INSERT INTO ... SELECT
。table_a
。table_b
是否包含新记录。当两个表中的MyISAM,table_b
在复制后没有包含新记录时。当两个表中InnoDB,table_b
确实包含复制后的新记录。我重复了这三次,并且正如预期的那样,结果每次都是相同的。
因此,简而言之,如果您的表格是MyISAM,它将被锁定。如果它是InnoDB,它不会。当然,此测试不考虑更新,但我预计结果将类似。