Блокировка таблицы MySql

0

Если у меня есть операция следующим образом:

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.

  • 0
    Вы проверили, чтобы убедиться, что таблица InnoDB, а не MyISAM? MyISAM не поддерживает транзакции.
  • 0
    Извините, забыл упомянуть об этом. Это InnoDB.
Теги:
locking

2 ответа

0
Лучший ответ

Нет, такая операция не должна блокировать любые таблицы (Предполагая уровень изоляции по умолчанию tx).

Обычно вообще нет блокировок на уровне таблицы, но есть некоторые типы блокировок, которые могут выглядеть как.

С уровнем изоляции по умолчанию в innodb, читатели никогда не блокируют писателей, а писатели никогда не блокируют читателей. Это по дизайну.

И если вы сделаете INSERT... SELECT, это будет более эффективно, но, вероятно, не будет отличаться в терминах блокировки.

Существует mutex с автоматическим вложением InnoDB, о котором вы можете прочитать (поиск документов для получения дополнительной информации), но это не блокировка таблицы.

0

В уровне сериализации REPEATABLE READ выбранные данные из foo будут заблокированы (но вы все равно можете добавить к foo или изменить строки, которые не были выбраны). Если вы вставляете только bar, я не думаю, что какие-либо блокировки произойдут с существующими строками в таблице.

Кроме того, есть ли у вас причина не использовать insert-select?

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню