这会锁定数据库吗?

时间:2010-07-22 18:57:23

标签: sql mysql

insert into test.qvalues 
  select * from qcvalues.qvalues;

我想知道上面的行是否锁定数据库VALUES

1 个答案:

答案 0 :(得分:4)

对我来说,文档有点不清楚:

Internal Locking Methods表明,在某些情况下,可以在另一个会话正在读取时插入MyISAM表:

  

MyISAM存储引擎支持   并发插入减少   读者和作家之间的争论   对于给定的表:如果是MyISAM表   中间没有空闲区块   数据文件,行总是   插入数据文件的末尾。   在这种情况下,您可以自由混合   并发INSERT和SELECT   没有的MyISAM表的语句   锁。也就是说,您可以插入行   同时进入MyISAM表   其他客户正在阅读它。   孔可以来自行   从中间删除或更新   的表。如果有洞,   并发插入被禁用但是   当自动再次启用时   所有洞都填满了新的   数据

但是,Table Locking Issues显示表格将被锁定直到SELECT完成(这符合您的情况):

  

表锁定也是不利的   以下场景:

     
      
  • 会话发出需要很长时间才能运行的SELECT。
  •   
  • 然后另一个会话在同一个表上发出UPDATE。本次会议   等待SELECT完成。
  •   
  • 另一个会话在同一个表上发出另一个SELECT语句。   因为UPDATE具有更高的优先级   比SELECT,这个SELECT等待   在等待之后更新完成   第一个完成的选择。
  •   

InnoDB表实现了行级锁,因此只有被读取的行才会被锁定,而不是整个表。

我没有依赖文档,而是尝试了一些测试:

  1. 创建两个具有相同结构的表:table_atable_b
  2. table_a填入500,000行。
  3. 使用table_a声明将数据从table_b复制到INSERT INTO ... SELECT
  4. 在复制过程中,使用其他会话将新行插入table_a
  5. 检查table_b是否包含新记录。
  6. 当两个表中的MyISAM,table_b在复制后没有包含新记录时。当两个表中InnoDB,table_b确实包含复制后的新记录。我重复了这三次,并且正如预期的那样,结果每次都是相同的。

    因此,简而言之,如果您的表格是MyISAM,它将被锁定。如果它是InnoDB,它不会。当然,此测试不考虑更新,但我预计结果将类似。