Hologres admite transacciones completas de lenguaje de definición de datos (DDL) y transacciones parciales de lenguaje de manipulación de datos (DML). De forma predeterminada, cada instrucción SQL se ejecuta como una transacción independiente. Este tema aborda las transacciones DDL, las transacciones DML mixtas (Beta), el comportamiento de bloqueo y los escenarios donde no se admiten transacciones.
Instrucciones de control de transacciones
Las siguientes instrucciones controlan los límites de las transacciones en Hologres:
|
Instrucción |
Descripción |
|
|
Inicia un bloque de transacción. |
|
|
Confirma todas las instrucciones de la transacción actual. |
|
|
Cancela la transacción actual y descarta todos los cambios. |
Transacciones DDL
Agrupe varias instrucciones DDL en una sola transacción para garantizar la atomicidad. Si alguna instrucción falla, revierta toda la transacción para restaurar el estado anterior del esquema.
Ejemplo: crear y revertir tablas en una sola transacción
BEGIN;
DROP TABLE IF EXISTS ddl_test;
CREATE TABLE ddl_test (
uid TEXT NOT NULL,
name TEXT NOT NULL
);
COMMIT;
Transacciones DML mixtas (Beta)
Disponibles en Hologres V2.0 y versiones posteriores, las transacciones DML mixtas permiten combinar instrucciones INSERT, UPDATE y DELETE en una sola transacción. Esto garantiza la atomicidad y consistencia en las escrituras de datos, lo que hace a Hologres adecuado para escenarios ligeros de procesamiento transaccional (TP).
Las transacciones DML mixtas no aprovechan por completo las capacidades distribuidas de Hologres. Solo admiten cargas de trabajo con bajas consultas por segundo (QPS) y no son adecuadas para escenarios de alta concurrencia.
Habilitar transacciones DML mixtas
Las transacciones DML mixtas están deshabilitadas de forma predeterminada. Habilite esta función con el siguiente parámetro de configuración unificada global (GUC):
SET hg_experimental_enable_transaction = on;
Comportamiento de reversión
Tras habilitar la función, todas las instrucciones DML dentro de una transacción se tratan como una unidad atómica:
Si alguna instrucción DML falla, el resto de las instrucciones de la transacción se revierten automáticamente.
Para descartar manualmente una transacción en curso, ejecute
ROLLBACK. Todas las instrucciones DML de la transacción se revertirán.
Ejemplo: reversión manual
SET hg_experimental_enable_transaction = on;
BEGIN;
DELETE FROM dml_test;
INSERT INTO dml_test VALUES (1, 'sss');
ROLLBACK;
Comportamiento de bloqueo
En una transacción DML mixta, todas las operaciones (lecturas, escrituras, eliminaciones y actualizaciones) adquieren bloqueos de escritura a nivel de tabla. Esto aplica también a las tablas que solo se leen, no únicamente a aquellas donde se escribe. Como resultado, varias transacciones que acceden a la misma tabla se ejecutan de forma secuencial, no concurrente.
Bajo una alta contención de bloqueos, el tiempo de ejecución de SQL aumenta significativamente y puede exceder los límites de tiempo de espera.
Ejemplo: transacciones concurrentes que compiten por el mismo bloqueo
Considere dos transacciones concurrentes que leen base_tbl:
-
El usuario A ejecuta:
SET hg_experimental_enable_transaction = on; BEGIN; DELETE FROM dml_test; INSERT INTO dml_test SELECT * FROM base_tbl; COMMIT; -
El usuario B ejecuta:
SET hg_experimental_enable_transaction = on; BEGIN; DELETE FROM dml_test_2; INSERT INTO dml_test_2 SELECT * FROM base_tbl; COMMIT;
Ambas transacciones leen base_tbl, por lo que ambas adquieren un bloqueo de escritura sobre ella. La transacción del usuario B espera hasta que finalice la transacción del usuario A.
Notas de uso
Las transacciones DML mixtas solo admiten cargas de trabajo de bajo QPS y no son adecuadas para escenarios de alta concurrencia. Ejecute pruebas de carga para determinar el límite de QPS de su carga de trabajo específica.
Si una transacción incluye operaciones de escritura y consulta, el rendimiento de la consulta es menor que sin transacciones. La degradación real del rendimiento varía según el escenario.
Límites
No se admiten transacciones que contengan instrucciones DDL y DML simultáneamente. Mezclar DDL y DML en la misma transacción provoca el siguiente error:
ERROR: INSERT in ddl transaction is not supported now
Ejemplo que desencadena este error:
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;