Оператор Select блокирует операцию чтения / записи в таблице InnoDB

У меня есть запрос Select, который выполняется в таблице транзакций, содержащей более 4 миллионов записей. Всякий раз, когда я выполняю этот запрос, я замечаю, что все операции записи и обновления в этой конкретной транзакционной таблице приостанавливаются, и мы начинаем получать исключения со стороны Java, которые превышают время ожидания блокировки, попробуйте перезапустить транзакцию. В настоящее время таймаут ожидания блокировки установлен на 200 секунд. Я не могу понять, почему оператор select может создавать такие блокировки для таблицы и блокировать все операторы вставки / обновления. Механизм хранения таблиц - это InnoDb, а первичный ключ - это ключ автоинкремента. Версия MySQL - 5.1.40. Также я не начинаю никаких транзакций до выполнения оператора select.

Любая идея?


person Anees    schedule 15.11.2009    source источник
comment
Вы пробовали EXPLAIN по запросу? Что там написано?   -  person Michael Todd    schedule 15.11.2009
comment
да я пробовал объяснить. Это показывает, что все индексы работают.   -  person Anees    schedule 15.11.2009


Ответы (1)


Итак, да, ваш SELECT в одной транзакции блокирует чтение записей этой таблицы, а операции записи, которые касаются тех же записей, должны будут дождаться завершения транзакции чтения (если она следует за двухфазной блокировкой).

Этот документ может помочь понять модель блокировок innodb.

person Dmitry    schedule 17.11.2009