У меня ошибка «Ошибка ожидания ожидания превышена» в MySQL, которую я не могу воспроизвести или диагностировать. Я уверен, что это тупик (в отличие от транзакции, которая захватывает блокировку, а затем переворачивает ее большие пальцы), потому что мои журналы показывают, что другой процесс запускался одновременно, также зависал, а затем продолжался при первом тайм-ауте. Но обычно InnoDB обнаруживает взаимные блокировки без тайм-аута. Поэтому я пытаюсь понять, почему этот тупик не был обнаружен.
Обе транзакции используют сериализуемый уровень изоляции. (У меня есть четкое представление о блокировке InnoDB на этом уровне изоляции.) В транзакции используется одна не-InnoDB (MyISAM) таблица, которую я вставляю и обновляю. Тем не менее, я не понимаю, как это может быть вовлечено в тупик, потому что я считаю, что MyISAM просто берет блокировку таблицы во время вставок и обновлений (а затем немедленно освобождает ее, так как MyISAM не является транзакционной), поэтому никакая другая блокировка не выполняется, пока эта удерживается блокировка стола.
Так что я убежден, что в тупике задействованы только таблицы InnoDB, что возвращает меня к вопросу о том, почему он не был обнаружен. Документация MySQL (http://dev.mysql.com/doc/refman/5.1/en/innodb-deadlock-detection.html) подразумевает, что обнаружение взаимоблокировок почти всегда работает. Проблемы, которые я обнаружил при поиске, включают в себя такие вещи, как явная «таблица блокировок», «изменение таблицы» и «вставка с задержкой». эти вещи, просто вставляет, обновляет и выбирает (некоторые из моих выборов «для обновления»).
Я попытался воспроизвести, создав одну таблицу MyISAM и пару таблиц InnoDB, выполняя различные последовательности вставки и обновления в MyISAM и «выбирая для обновления» в InnoDB. Но каждый раз, когда я создавал тупик, InnoDB немедленно сообщал об этом. Я не смог воспроизвести тайм-аут.
Любые другие советы для диагностики этого? Я использую mysql 5.1.49.