MySql表锁定

时间:2009-12-22 10:59:29

标签: mysql locking

如果我有如下操作:

begin transaction (auto commit = false)

select * from foo;

iterate above result set:
  insert into bar (insert the values from the above result set into bar);

commit

在上面的操作中,表foo是否会被锁定,直到所有插入条形图完成为止?此外,当插入物继续进行时,表格栏是否会被锁定,如同在中,没有人能够读取条形图(不会对插入物感到困扰)?

假设数据库正在使用隔离级别,REPEATABLE READ且存储引擎是InnoDB。

2 个答案:

答案 0 :(得分:0)

在REPEATABLE READ序列化级别中,来自foo的选定数据将被锁定(但您仍可以附加到foo,或更改未选中的行)。如果只插入bar,我不相信表中现有行会发生任何锁定。

另外,您是否有理由不使用insert-select?

insert into bar (...) select ... from foo;

答案 1 :(得分:0)

不,像这样的innodb操作不会锁定任何表(假设默认的tx隔离级别)。

通常根本没有表级锁,但是有些类型的锁可以看起来像。

使用innodb中的默认隔离级别,读者永远不会阻止编写者和编写者永远不会阻止读者。这是设计的。

如果你进行INSERT ...选择它会更有效率,但在锁定方面可能没有什么不同。

您可能希望阅读InnoDB auto-inc mutex(搜索文档以获取更多信息),但这不是表锁。