7.1.18 Отслеживание состояния сеанса сервером
Сервер 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управляет этим отслеживателем. Для отслеживания изменений значений чувствительных системных переменных требуется привилегияSENSITIVE_VARIABLES_OBSERVER. -
Доступные GTID. Переменная системы
session_track_gtidsуправляет этим отслеживателем. Информация о состоянии и характеристиках транзакции. Переменная системы
session_track_transaction_infoуправляет этим отслеживателем.
Описание переменных системы, связанных с отслеживанием, см. в разделе 7.1.8, «Server System Variables». Эти переменные позволяют управлять уведомлениями о изменениях, но не предоставляют способ доступа к информации об уведомлениях. Уведомления передаются в протоколе MySQL клиент/сервер, который включает информацию об отслеживании в пакетах OK, чтобы можно было обнаружить изменения в состоянии сеанса.
Поддержка отслеживателей состояния сеанса C API
Чтобы клиентские приложения могли извлекать информацию об изменениях состояния из пакетов OK, возвращаемых сервером, C API MySQL предоставляет пару функций:
-
извлекает первую часть информации об изменениях состояния, полученную от сервера. См. .
-
извлекает любую оставшуюся информацию об изменениях состояния, полученную от сервера. После успешного вызова несколько раз вызывайте эту функцию, пока она не вернет ошибку. См. .
Поддержка отслеживателей состояния сеанса набора тестов
Программа 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.