Назад | Перейти на главную страницу

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

Работая над некоторыми проблемами производительности 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'

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