Подтвердить что ты не робот

Обнаружение заблокированных таблиц (заблокировано LOCK TABLE)

Есть ли способ обнаружить заблокированные таблицы в MySQL? Я имею в виду таблицы, заблокированные командой LOCK TABLE table WRITE/READ.

(Обратите внимание, что читатели, заинтересованные в обнаружении названных блокировок, полученных с помощью GET_LOCK, должны читать вместо всех текущих блокировок из get_lock.)

4b9b3361

Ответ 2

Используйте SHOW OPEN TABLES: http://dev.mysql.com/doc/refman/5.1/en/show-open-tables.html

Вы можете сделать что-то вроде этого

SHOW OPEN TABLES WHERE `Table` LIKE '%[TABLE_NAME]%' AND `Database` LIKE '[DBNAME]' AND In_use > 0;

чтобы проверить любые заблокированные таблицы в базе данных.

Ответ 3

Вы можете использовать SHOW OPEN TABLES для отображения каждого состояния блокировки таблицы. Более подробная информация на странице doc команды здесь.

Ответ 4

Самый простой способ:

SHOW OPEN TABLES WHERE In_use > 0

Вы получаете заблокированные таблицы только текущей базы данных.

Ответ 5

Вы можете создать свой собственный замок с помощью GET_LOCK (lockName, timeOut)

Если вы делаете GET_LOCK(lockName, 0) с 0 таймаутом перед блокировкой таблиц, а затем следуете этому с помощью RELEASE_LOCK(lockName), тогда все остальные потоки, выполняющие GET_LOCK(), получат значение 0, которое скажет им, что блокировка удерживается другим потоком.

Однако это не сработает, если у вас нет всех потоков, вызывающих GET_LOCK() перед блокировкой таблиц. Документация для таблиц блокировки здесь

Надеюсь, что это поможет!

Ответ 7

Вы также можете получить все необходимые подробности от performance_schema:

SELECT
OBJECT_SCHEMA
,OBJECT_NAME
,GROUP_CONCAT(DISTINCT EXTERNAL_LOCK)
FROM performance_schema.table_handles 
WHERE EXTERNAL_LOCK IS NOT NULL

GROUP BY
OBJECT_SCHEMA
,OBJECT_NAME

Это работает как

show open tables WHERE In_use > 0