14.16.2.3 Сохранение и согласованность информации о транзакциях и блокировках InnoDB
Данные, доступные в таблицах транзакций и блокировок (INNODB_TRX, INNODB_LOCKS и INNODB_LOCK_WAITS), представляют собой «мгновенный снимок» быстро меняющихся данных. Это отличается от пользовательских таблиц, где данные изменяются только при выполнении обновлений, инициированных приложением. Подлежащие данные — это управляемые внутренней системой данные, которые могут очень быстро изменяться.
В целях производительности и для минимизации возможности вводящих в заблуждение объединений между таблицами транзакций и блокировок, InnoDB собирает необходимую информацию о транзакциях и блокировках в промежуточный буфер всякий раз, когда выполняется SELECT по любой из таблиц. Этот буфер обновляется только в том случае, если прошло более 0,1 секунды с момента последнего прочтения буфера. Данные, необходимые для заполнения трех таблиц, извлекаются атомарно и согласованно и сохраняются в этом глобальном внутреннем буфере, образуя моментальный «снимок».
Если несколько обращений к таблицам происходят в течение 0,1 секунды (что почти неизбежно при обработке MySQL объединения между этими таблицами), то для удовлетворения запроса используется тот же «снимок».
Правильный результат возвращается при объединении любой из этих таблиц вместе в одном запросе, потому что данные для трех таблиц берутся из одного «снимка». Поскольку буфер не обновляется с каждым запросом к любой из этих таблиц, если вы выполните отдельные запросы к этим таблицам в течение одной десятой секунды, результаты будут одинаковыми от запроса к запросу. С другой стороны, два отдельных запроса к одной и той же или к разным таблицам, выполненные с интервалом более одной десятой секунды, могут показать разные результаты, так как данные берутся из разных «снимков».
Поскольку InnoDB должна временно приостанавливаться во время сбора данных о транзакциях и блокировках, слишком частые запросы к этим таблицам могут отрицательно сказаться на производительности, наблюдаемой другими пользователями.
Поскольку эти таблицы содержат конфиденциальную информацию (по крайней мере INNODB_LOCKS.LOCK_DATA и INNODB_TRX.TRX_QUERY), по соображениям безопасности только пользователи с привилегией PROCESS разрешены на чтение из них.
Как описано ранее, данные, заполняющие таблицы транзакций и блокировок (INNODB_TRX, INNODB_LOCKS и INNODB_LOCK_WAITS), извлекаются автоматически и сохраняются в промежуточный буфер, который предоставляет «моментальный снимок». Данные по всем трем таблицам согласованы при запросе из одного «снимка». Однако подлежащие данные меняются так быстро, что аналогичные «мгновенные снимки» других, столь же быстро изменяемых данных, могут не быть синхронизированы. Поэтому следует проявлять осторожность при сравнении данных в таблицах InnoDB транзакций и блокировок с данными в таблице PROCESSLIST. Данные из таблицы PROCESSLIST не берутся из того же «снимка», что и данные о блокировках и транзакциях. Даже если вы выполните одно SELECT (объединяя INNODB_TRX и PROCESSLIST, например), содержимое этих таблиц, как правило, не согласовано. INNODB_TRX может ссылаться на строки, отсутствующие в PROCESSLIST, или текущий выполняемый SQL-запрос транзакции, показанный в INNODB_TRX.TRX_QUERY, может отличаться от запроса в PROCESSLIST.INFO.
© 2025 Oracle
Licensed under the GPLv2 License.