Hologres prend en charge les transactions complètes du langage de définition de données (DDL) et certaines transactions du langage de manipulation de données (DML). Par défaut, chaque instruction SQL s'exécute dans sa propre transaction. Cette rubrique décrit les transactions DDL, les transactions DML mixtes (bêta), le comportement de verrouillage ainsi que les scénarios non pris en charge par les transactions.
Instructions de contrôle des transactions
Les instructions suivantes permettent de contrôler les limites des transactions dans Hologres :
| Instruction | description |
|---|---|
BEGIN |
Démarre un bloc de transaction. |
COMMIT |
Valide toutes les instructions de la transaction en cours. |
ROLLBACK |
Interrompt la transaction en cours et annule toutes les modifications. |
Transactions DDL
Regroupez plusieurs instructions DDL au sein d'une seule transaction pour garantir l'atomicité. Si une instruction échoue, annulez l'intégralité de la transaction afin de restaurer l'état précédent du schéma.
Exemple : créez et annulez des tables dans une seule transaction
BEGIN;
DROP TABLE IF EXISTS ddl_test;
CREATE TABLE ddl_test (
uid TEXT NOT NULL,
name TEXT NOT NULL
);
COMMIT;
Transactions DML mixtes (bêta)
Disponibles à partir de Hologres V2.0, les transactions DML mixtes vous permettent de combiner des instructions INSERT, UPDATE et DELETE au sein d'une même transaction. Cette fonctionnalité assure l'atomicité et la cohérence des écritures de données, rendant Hologres adapté aux scénarios légers de traitement transactionnel (TP).
Les transactions DML mixtes ne peuvent pas exploiter pleinement les capacités distribuées de Hologres. Elles ne prennent en charge que les charges de travail avec un faible nombre de requêtes par seconde (QPS) et ne conviennent pas aux scénarios à forte concurrence.
Activer les transactions DML mixtes
Les transactions DML mixtes sont désactivées par défaut. Activez cette fonctionnalité à l'aide du paramètre de configuration unifiée globale (GUC) suivant :
SET hg_experimental_enable_transaction = on;
Comportement d'annulation
Une fois la fonctionnalité activée, toutes les instructions DML d'une transaction sont traitées comme une unité atomique :
Si une instruction DML échoue, toutes les autres instructions de la transaction sont automatiquement annulées.
Pour annuler manuellement une transaction en cours, exécutez l'instruction
ROLLBACK. Toutes les instructions DML de la transaction sont alors annulées.
Exemple : annulation manuelle
SET hg_experimental_enable_transaction = on;
BEGIN;
DELETE FROM dml_test;
INSERT INTO dml_test VALUES (1, 'sss');
ROLLBACK;
Comportement de verrouillage
Dans une transaction DML mixte, toutes les opérations — lectures, écritures, suppressions et mises à jour — acquièrent des verrous d'écriture au niveau de la table. Cela s'applique également aux tables en lecture seule, et pas uniquement aux tables faisant l'objet d'écritures. Par conséquent, plusieurs transactions qui accèdent à la même table s'exécutent de manière séquentielle et non simultanée.
En cas de forte contention sur les verrous, le temps d'exécution des instructions SQL augmente considérablement et peut dépasser les délais d'expiration.
Exemple : transactions concurrentes en compétition pour le même verrou
Prenons l'exemple de deux transactions concurrentes qui lisent toutes deux la table base_tbl :
-
L'utilisateur A exécute :
SET hg_experimental_enable_transaction = on; BEGIN; DELETE FROM dml_test; INSERT INTO dml_test SELECT * FROM base_tbl; COMMIT; -
L'utilisateur B exécute :
SET hg_experimental_enable_transaction = on; BEGIN; DELETE FROM dml_test_2; INSERT INTO dml_test_2 SELECT * FROM base_tbl; COMMIT;
Comme les deux transactions lisent la table base_tbl, elles acquièrent toutes deux un verrou d'écriture sur celle-ci. La transaction de l'utilisateur B attend donc la fin de la transaction de l'utilisateur A.
Remarques d'utilisation
Les transactions DML mixtes ne conviennent qu'aux charges de travail à faible QPS et ne sont pas adaptées aux scénarios à forte concurrence. Effectuez des tests de charge pour déterminer le plafond de QPS spécifique à votre charge de travail.
Si une transaction inclut à la fois des opérations d'écriture et de requête, les performances des requêtes seront inférieures à celles observées sans transaction. La dégradation réelle des performances varie selon le scénario.
Limitations
Les transactions contenant à la fois des instructions DDL et DML ne sont pas prises en charge. Le mélange d'instructions DDL et DML dans une même transaction génère l'erreur suivante :
ERROR: INSERT in ddl transaction is not supported now
Exemple déclenchant cette erreur :
BEGIN;
DROP TABLE IF EXISTS dml_test;
CREATE TABLE dml_test (
uid TEXT NOT NULL,
name TEXT NOT NULL
);
INSERT INTO dml_test VALUES ('1', 'tom');
COMMIT;