5.1.15 Отслеживание состояния сеанса сервером
Сервер MySQL реализует несколько трекеров состояния сеанса. Клиент может включить эти трекеры, чтобы получать уведомления о изменениях в состоянии его сеанса.
Использование трекеров состояния сеанса
Трекеры состояния сеанса могут использоваться, например, для:
Упрощения миграции сеанса.
Упрощения переключения транзакций.
Одно из применений механизма трекера — предоставить средства для подключений MySQL и клиентских приложений, чтобы определить, доступен ли контекст сеанса для миграции сеанса с одного сервера на другой. (Для изменения сеансов в среде с балансировкой нагрузки необходимо определить, есть ли состояние сеанса, которое нужно учитывать при принятии решения о возможности переключения.)
Другое применение механизма трекера — позволить приложениям знать, когда транзакции могут быть перемещены из одного сеанса в другой. Отслеживание состояния транзакций позволяет это сделать, что полезно для приложений, которые могут захотеть перенести транзакции с загруженного сервера на менее загруженный. Например, соединитель балансировки нагрузки, управляющий пулом подключений к клиенту, может перемещать транзакции между доступными сеансами в пуле.
Однако переключение сеансов нельзя выполнять в произвольные моменты. Если сеанс находится посреди транзакции, для которой были выполнены чтение или запись, то переключение на другой сеанс подразумевает откат транзакции в исходном сеансе. Переключение сеансов должно выполняться только тогда, когда транзакция еще не содержит операций чтения или записи.
Примеры случаев, когда транзакции могут быть разумно переключены:
Сразу после
START TRANSACTIONПосле
COMMIT AND CHAIN
Помимо знания состояния транзакции, полезно знать характеристики транзакции, чтобы использовать те же характеристики, если транзакция переносится в другой сеанс. Следующие характеристики релевантны для этой цели:
READ ONLY
READ WRITE
ISOLATION LEVEL
WITH CONSISTENT SNAPSHOT
Доступные трекеры состояния сеанса
Для поддержки операций отслеживания сеанса доступны уведомления об этих типах информации о состоянии клиентского сеанса:
-
Изменения следующих атрибутов состояния клиентского сеанса:
Схема по умолчанию (база данных).
Значения системных переменных, специфичные для сеанса.
Пользовательские переменные.
Временные таблицы.
Подготовленные запросы.
Эта информация отслеживается переменной системы
session_track_state_change. -
Изменения имени схемы по умолчанию. Эта информация отслеживается переменной системы
session_track_schema. -
Изменения значений системных переменных сеанса. Эта информация отслеживается переменной системы
session_track_system_variables. -
Доступные GTID. Эта информация отслеживается переменной системы
session_track_gtids. Информация о состоянии и характеристиках транзакции. Эта информация отслеживается переменной системы
session_track_transaction_info.
Описание переменных системы, связанных с трекером, см. в разделе 5.1.7, «Переменные сервера». Эти переменные позволяют управлять уведомлениями об изменениях, но не предоставляют способ доступа к информации об уведомлениях. Уведомления происходят в протоколе MySQL клиент/сервер, который включает информацию о трекере в пакетах OK, чтобы можно было определить изменения состояния сеанса.
Поддержка трекеров состояния сеанса C API
Для того, чтобы клиентские приложения могли извлечь информацию об изменениях состояния из пакетов OK, возвращаемых сервером, API MySQL C предоставляет пару функций:
-
извлекает первую часть информации об изменениях состояния, полученной от сервера. См. .
-
извлекает любую оставшуюся информацию об изменениях состояния, полученную от сервера. После успешного вызова , вызывайте эту функцию повторно, пока она возвращает успех. См. .
Поддержка трекеров состояния сеанса набора тестов
Программа mysqltest имеет команды disable_session_track_info и enable_session_track_info, которые управляют тем, происходят ли уведомления трекера состояния сеанса. Вы можете использовать эти команды, чтобы увидеть, какие уведомления производят SQL-запросы в командной строке. Предположим, что файл testscript содержит следующий скрипт mysqltest:
DROP TABLE IF EXISTS test.t1;
CREATE TABLE test.t1 (i INT, f FLOAT);
--enable_session_track_info
SET @@SESSION.session_track_schema=ON;
SET @@SESSION.session_track_system_variables='*';
SET @@SESSION.session_track_state_change=ON;
USE information_schema;
SET NAMES 'utf8mb4';
SET @@SESSION.session_track_transaction_info='CHARACTERISTICS';
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET TRANSACTION READ WRITE;
START TRANSACTION;
SELECT 1;
INSERT INTO test.t1 () VALUES();
INSERT INTO test.t1 () VALUES(1, RAND());
COMMIT;
Запустите скрипт следующим образом, чтобы увидеть информацию, предоставляемую включенными трекерами. Для описания информации Tracker:, отображаемой mysqltest для различных трекеров, см. .
$> mysqltest < testscript
DROP TABLE IF EXISTS test.t1;
CREATE TABLE test.t1 (i INT, f FLOAT);
SET @@SESSION.session_track_schema=ON;
SET @@SESSION.session_track_system_variables='*';
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- session_track_system_variables
-- *
SET @@SESSION.session_track_state_change=ON;
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- session_track_state_change
-- ON
USE information_schema;
-- Tracker : SESSION_TRACK_SCHEMA
-- information_schema
-- Tracker : SESSION_TRACK_STATE_CHANGE
-- 1
SET NAMES 'utf8mb4';
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- character_set_client
-- utf8mb4
-- character_set_connection
-- utf8mb4
-- character_set_results
-- utf8mb4
-- Tracker : SESSION_TRACK_STATE_CHANGE
-- 1
SET @@SESSION.session_track_transaction_info='CHARACTERISTICS';
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- session_track_transaction_info
-- CHARACTERISTICS
-- Tracker : SESSION_TRACK_STATE_CHANGE
-- 1
-- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
--
-- Tracker : SESSION_TRACK_TRANSACTION_STATE
-- ________
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
-- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET TRANSACTION READ WRITE;
-- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
-- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; SET TRANSACTION READ WRITE;
START TRANSACTION;
-- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
-- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; START TRANSACTION READ WRITE;
-- Tracker : SESSION_TRACK_TRANSACTION_STATE
-- T_______
SELECT 1;
1
1
-- Tracker : SESSION_TRACK_TRANSACTION_STATE
-- T_____S_
INSERT INTO test.t1 () VALUES();
-- Tracker : SESSION_TRACK_TRANSACTION_STATE
-- T___W_S_
INSERT INTO test.t1 () VALUES(1, RAND());
-- Tracker : SESSION_TRACK_TRANSACTION_STATE
-- T___WsS_
COMMIT;
-- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
--
-- Tracker : SESSION_TRACK_TRANSACTION_STATE
-- ________
ok
Перед инструкцией START
TRANSACTION выполняется две инструкции SET
TRANSACTION, которые устанавливают уровень изоляции и характеристики режима доступа для следующей транзакции. Значение SESSION_TRACK_TRANSACTION_CHARACTERISTICS указывает эти значения следующей транзакции, которые были установлены.
После инструкции COMMIT, которая завершает транзакцию, значение SESSION_TRACK_TRANSACTION_CHARACTERISTICS отображается как пустое. Это указывает, что характеристики следующей транзакции, установленные перед началом транзакции, были сброшены и применяются значения по умолчанию сеанса. Чтобы отслеживать изменения этих значений по умолчанию сеанса, отслеживайте значения переменных системы transaction_isolation и transaction_read_only.
Чтобы увидеть информацию о GTID, включите трекер SESSION_TRACK_GTIDS с помощью переменной системы session_track_gtids.
© 2025 Oracle
Licensed under the GPLv2 License.