Если у меня есть операция следующим образом:
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 будет заблокирована до тех пор, пока все вставки в панель не будут выполнены? Кроме того, в то время как вставки продолжаются, блокировка панели таблицы, как и в, никто не сможет читать бар (не беспокоиться о вставках)?
Предположим, что db использует уровень изоляции, REPEATABLE READ и механизм хранения - InnoDB.
Нет, такая операция не должна блокировать любые таблицы (Предполагая уровень изоляции по умолчанию tx).
Обычно вообще нет блокировок на уровне таблицы, но есть некоторые типы блокировок, которые могут выглядеть как.
С уровнем изоляции по умолчанию в innodb, читатели никогда не блокируют писателей, а писатели никогда не блокируют читателей. Это по дизайну.
И если вы сделаете INSERT... SELECT, это будет более эффективно, но, вероятно, не будет отличаться в терминах блокировки.
Существует mutex с автоматическим вложением InnoDB, о котором вы можете прочитать (поиск документов для получения дополнительной информации), но это не блокировка таблицы.
В уровне сериализации REPEATABLE READ выбранные данные из foo
будут заблокированы (но вы все равно можете добавить к foo
или изменить строки, которые не были выбраны). Если вы вставляете только bar
, я не думаю, что какие-либо блокировки произойдут с существующими строками в таблице.
Кроме того, есть ли у вас причина не использовать insert-select?
insert into bar (...) select ... from foo;