2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Le serveur MySQL implémente plusieurs trackers d'état de session. Les clients peuvent permettre à ces trackers de recevoir des notifications de changements d'état de session.
Les trackers d'état de session remplissent les objectifs suivants :
Le mécanisme de suivi permet aux connecteurs MySQL et aux applications client de déterminer si un contexte de session est disponible pour permettre la migration de session d'un serveur à un autre. (Pour changer de session dans un environnement à charge équilibrée, il est nécessaire de détecter s'il existe un état de session qui doit être pris en compte pour décider si un changement est possible.)
Le mécanisme de suivi permet aux applications de savoir quand les transactions peuvent être déplacées d'une session à une autre. Le suivi de l'état des transactions permet cela, ce qui est utile pour les applications qui souhaitent déplacer des transactions d'un serveur occupé vers un serveur moins chargé. Par exemple, un connecteur d'équilibrage de charge qui gère un pool de connexions client peut déplacer des transactions entre les sessions disponibles dans le pool.
Cependant, le changement de session ne peut avoir lieu à aucun moment. Si la session est au milieu d'une transaction qui a terminé une lecture ou une écriture, le passage à une autre session signifie que la transaction sur la session d'origine est annulée. Un changement de session ne peut se produire que lorsqu'aucune opération de lecture ou d'écriture n'a été effectuée au sein de la transaction.
Exemples de transactions qui pourraient raisonnablement changer :
En plus de comprendre le statut de la transaction, vous pouvez également comprendre les caractéristiques de la transaction afin de pouvoir utiliser les mêmes caractéristiques lorsque la transaction est déplacée vers une autre session. Les caractéristiques suivantes y sont associées :
- READ ONLY
- READ WRITE
- ISOLATION LEVEL
- WITH CONSISTENT SNAPSHOT
Pour prendre en charge les activités de suivi de session, des notifications peuvent être fournies pour les types suivants d'informations sur l'état de la session client :
(1) Modifications apportées à ces propriétés de l'état de la session client :
La variable système session_track_state_change contrôle ce tracker.
(2) Remplacez le nom du schéma par défaut. La variable système session_track_schema contrôle ce tracker.
(3) Modifiez la valeur de session de la variable système. La variable système session_track_system_variables contrôle ce tracker. L'autorisation SENSITIVE_VARIABLES_OBSERVER est requise pour suivre les modifications des valeurs des variables système sensibles.
(4) GTID disponible. La variable système session_track_gtids contrôle ce tracker.
(5) Informations sur l'état et les caractéristiques de la transaction. La variable système session_track_transaction_info contrôle ce tracker.
Ces variables système permettent de contrôler les notifications de modification qui se produisent, mais ne fournissent pas de moyen d'accéder aux informations de notification. La notification se produit au sein du protocole client/serveur MySQL, qui inclut des informations de suivi dans les paquets OK afin de détecter les changements dans l'état de la session.
Pour permettre aux applications clientes d'extraire les informations de changement d'état des paquets OK renvoyés par le serveur, l'API MySQL C fournit deux fonctions :
Le programme mysqltest dispose des commandes Disable_session_track_info et Enable_sessionutrack_ininfo pour contrôler si les notifications du suivi de session se produisent. Vous pouvez utiliser ces commandes pour afficher les notifications produites par les instructions SQL à partir de la ligne de commande. Supposons qu'un fichier testscript contienne le script mysqltest suivant :
- 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;
Exécutez le script comme suit pour voir les informations fournies par les trackers activés. .
- $> 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
Avant l'instruction START TRANSACTION, exécutez deux instructions SET TRANSACTION pour définir les caractéristiques du niveau d'isolement et du mode d'accès pour la transaction suivante. La valeur SESSION_TRACK_TRANSACTION_CHARACTERISTICS indique la valeur de transaction suivante qui a été définie.
Après une instruction COMMIT qui termine une transaction, la valeur SESSION_TRACK_transaction_CHARACTERISTICS est signalée comme vide. Cela signifie que les propriétés de transaction suivantes qui ont été définies avant le démarrage de la transaction ont été réinitialisées et les valeurs par défaut de la session sont appliquées. Pour suivre les modifications apportées à ces valeurs par défaut de session, suivez les valeurs de session des variables système transaction_inisolation et transaction_read_only.
Pour afficher des informations sur les GTID, activez le tracker SESSION_TRACK_GTIDs à l'aide de la variable système SESSION_TRACK_GTIDs.