如果我有如下操作:
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。
答案 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(搜索文档以获取更多信息),但这不是表锁。