Ответ 1
SHOW OPEN TABLES
чтобы показать состояние каждой таблицы и ее блокировки.
Для именованных блокировок посмотрите Показать все текущие блокировки от get_lock
Есть ли способ обнаружить заблокированные таблицы в MySQL? Я имею в виду таблицы, заблокированные командой LOCK TABLE table WRITE/READ
.
(Обратите внимание, что читатели, заинтересованные в обнаружении названных блокировок, полученных с помощью GET_LOCK
, должны читать вместо всех текущих блокировок из get_lock.)
SHOW OPEN TABLES
чтобы показать состояние каждой таблицы и ее блокировки.
Для именованных блокировок посмотрите Показать все текущие блокировки от get_lock
Используйте 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;
чтобы проверить любые заблокированные таблицы в базе данных.
Вы можете использовать SHOW OPEN TABLES
для отображения каждого состояния блокировки таблицы. Более подробная информация на странице doc команды здесь.
Самый простой способ:
SHOW OPEN TABLES WHERE In_use > 0
Вы получаете заблокированные таблицы только текущей базы данных.
Вы можете создать свой собственный замок с помощью GET_LOCK (lockName, timeOut)
Если вы делаете GET_LOCK(lockName, 0)
с 0 таймаутом перед блокировкой таблиц, а затем следуете этому с помощью RELEASE_LOCK(lockName)
, тогда все остальные потоки, выполняющие GET_LOCK()
, получат значение 0, которое скажет им, что блокировка удерживается другим потоком.
Однако это не сработает, если у вас нет всех потоков, вызывающих GET_LOCK()
перед блокировкой таблиц. Документация для таблиц блокировки здесь
Надеюсь, что это поможет!
Вы также можете получить все необходимые подробности от 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