Для подробностей о сценарии:
Пытаясь воспроизвести случай, я заблокировал сеанс B, а затем заблокировал сеанс C ... Обратите внимание, что если сеанс B действительно ожидал чего-то другого раньшеполучая блокировку метаданных для таблицы, сеанс C не имеет причин ждать.
Теперь в общем:
Уже предоставленные блокировки метаданных видны в performance_schema
, в таблице metadata_locks
, с LOCK_STATUS
как GRANTED
.
См. документ: https://dev.mysql.com/doc/refman/8.0/en/metadata-locks-table.html
Это полезно, чтобы увидеть, какой сессии принадлежит какая блокировка.
Метаданные блокируютожидающие сеансы также видны в той же таблице, с LOCK_STATUS
как PENDING
.
Это полезно, чтобы увидеть что сеанс ожидает.
(заблокированный) сеанс ожидает блокировки чего-либо, что, в свою очередь, может быть уже заблокировано (с различными LOCK_TYPE
и LOCK_DURATION
) другими сеансами, но прямой связи «Сессия X ожидает сеанса Y» нет.здесь подразумевается, что замок уже установлен.
WheНесколько сессий ожидают одного и того же ресурса, и когда ресурс становится доступным (сеанс освободил блокировку метаданных), попытка предвидеть порядок обработки (на мой взгляд) рискованна, и логика приложения не должна зависеть от этого:Насколько я знаю, текущая реализация действительно является FIFO, но это может измениться в любое время и не задокументировано.
Рациональным здесь является то, что сервер должен иметь некоторую степень свободы, так что реализациявозможна другая политика планирования, например, по соображениям производительности.Если какое-либо приложение «ожидает» заданный порядок, оно сломается и предотвратит любые изменения.