Какие условия вызывают блокировку уровня таблицы

Работая над некоторыми проблемами производительности vBulletin, я столкнулся с такой ситуацией, когда все застревает в ожидании блокировки на уровне таблицы:

 Id  Command Time State                       Info
 83  Query   47  Writing to net               SELECT /*!40001 SQL_NO_CACHE */ * FROM `post`
 87  Query   117 Waiting for table level lock UPDATE session     SET lastactivity = 1362132185, location = '/for
 89  Query   116 Waiting for table level lock SELECT *    FROM session    WHERE userid = 0     AND host = '178.1
 90  Query   113 Waiting for table level lock SELECT *    FROM session    WHERE userid = 0     AND host = '66.24
 94  Query   108 Waiting for table level lock select userid from session where sessionhash = '2269de072969ab9d42
 96  Query   102 Waiting for table level lock SELECT *    FROM session    WHERE sessionhash = 'b0e3d290e9f609160
129  Query   15  Waiting for table level lock SELECT *    FROM session    WHERE userid = 0     AND host = '65.55
130  Query   14  Waiting for table level lock SELECT *    FROM session    WHERE userid = 0     AND host = '71.19
132  Query   13  Waiting for table level lock SELECT *    FROM session    WHERE userid = 0     AND host = '178.1

Обычно шаблон для диагностики проблем с блокировкой состоит в том, чтобы выяснить, какой запрос не заблокирован, и, как правило, это ваш виновник. Но в этом случае он читает несвязанную таблицу, и запрос, который выполнялся дольше всего (что, безусловно, является частью проблемы, поскольку это единственный запрос на обновление), ТАКЖЕ заблокирован.

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


Добавить детали
Это примерно стандартная установка mysql; нет разделения или других махинаций
Таблица posts это типа MyISAM
Таблица session это типа ПАМЯТЬ
Другие вопросы (такие как вопиющая неэффективность запроса 83 или нецелесообразность использования MyISAM) интересны, но не то, что требуется.

Полный текст запроса 87 выглядит так:

Query UPDATE session SET lastactivity = 1362132185, location = '/forums/forumdisplay.php?f=421', inforum = 421, inthread = 0, incalendar = 0, badlocation = 0 WHERE sessionhash = 'e6322935fe2df18106878473f310d91f'

1 ответ

Решение

Mysqldump работает во время блокировки? Похоже, что поток 83 может быть в настоящее время экспортирует post но, возможно, позвонил LOCK TABLES на БД, чтобы получить согласованную позицию на всех столах.

Другие вопросы по тегам