Caso 1: INSERT en una partición de una tabla de la familia MergeTree*
- Atómico: un INSERT se completa correctamente o se rechaza por completo: si se envía una confirmación al cliente, se insertaron todas las filas; si se envía un error al cliente, no se insertó ninguna fila.
- Consistente: si no se viola ninguna restricción de la tabla, se insertan todas las filas de un INSERT y el INSERT se completa correctamente; si se violan restricciones, no se inserta ninguna fila.
- Aislado: los clientes concurrentes observan una instantánea coherente de la tabla: el estado de la tabla tal como era antes del intento de INSERT o después de que el INSERT se complete correctamente; no se observa ningún estado parcial. Los clientes dentro de otra transacción tienen aislamiento de instantánea, mientras que los clientes fuera de una transacción tienen el nivel de aislamiento read uncommitted.
- Duradero: un INSERT completado correctamente se escribe en el sistema de archivos antes de responder al cliente, en una sola réplica o en varias réplicas (controlado por la configuración
insert_quorum), y ClickHouse puede pedirle al SO que sincronice los datos del sistema de archivos en el medio de almacenamiento (controlado por la configuraciónfsync_after_insert). - Es posible hacer INSERT en varias tablas con una sola sentencia si intervienen vistas materializadas (el INSERT del cliente se hace en una tabla que tiene vistas materializadas asociadas).
Caso 2: INSERT en varias particiones de una tabla de la familia MergeTree*
- Si la tabla tiene muchas particiones y el INSERT abarca varias particiones, la inserción en cada partición es transaccional por separado
Caso 3: INSERT en una tabla distribuida de la familia MergeTree*
- Un INSERT en una tabla Distributed no es transaccional en su conjunto, mientras que la inserción en cada segmento sí lo es
Caso 4: Uso de una tabla Buffer
- las inserciones en tablas Buffer no son atómicas, aisladas, consistentes ni duraderas
Caso 5: Uso de async_insert
- la atomicidad está garantizada incluso si
async_insertestá habilitado ywait_for_async_insertestá configurado en 1 (valor predeterminado), pero siwait_for_async_insertestá configurado en 0, la atomicidad no está garantizada.
Notas
- las filas insertadas desde el cliente en algún formato de datos se empaquetan en un único bloque cuando:
- el formato de inserción está basado en filas (como CSV, TSV, Values, JSONEachRow, etc.) y los datos contienen menos de
max_insert_block_sizefilas (~1 000 000 de forma predeterminada) o menos demin_chunk_bytes_for_parallel_parsingbytes (10 MB de forma predeterminada) en caso de usar parsing paralelo (activado de forma predeterminada) - el formato de inserción está basado en columnas (como Native, Parquet, ORC, etc.) y los datos contienen un único bloque de datos
- el formato de inserción está basado en filas (como CSV, TSV, Values, JSONEachRow, etc.) y los datos contienen menos de
- el tamaño del bloque insertado, en general, puede depender de muchos ajustes (por ejemplo:
max_block_size,max_insert_block_size,min_insert_block_size_rows,min_insert_block_size_bytes,preferred_block_size_bytes, etc.) - si el cliente no recibió respuesta del servidor, no sabe si la transacción se completó correctamente y puede repetirla usando las propiedades de inserción exactly-once
- ClickHouse usa MVCC con aislamiento de instantánea internamente para transacciones concurrentes
- todas las propiedades ACID se mantienen incluso en caso de terminación forzada o fallo del servidor
- para garantizar inserciones duraderas en la configuración típica, debe habilitarse insert_quorum en distintas AZ o fsync
- la “consistencia” en términos ACID no cubre la semántica de los sistemas distribuidos; consulte https://jepsen.io/consistency, que se controla mediante distintos ajustes (select_sequential_consistency)
- esta explicación no cubre una nueva funcionalidad de transacciones que permite tener transacciones completas sobre múltiples tablas, vistas materializadas y múltiples SELECT, etc. (consulte la siguiente sección sobre Transactions, Commit, and Rollback)
Transacciones, Commit y Rollback
Requisitos
- Implemente ClickHouse Keeper o ZooKeeper para hacer seguimiento de las transacciones
- Solo BD Atomic (predeterminada)
- Solo el motor de tabla MergeTree no replicado
- Habilite la compatibilidad Experimental con transacciones añadiendo esta configuración en
config.d/transactions.xml:
Notas
- Esta es una funcionalidad experimental, por lo que es de esperar que haya cambios.
- Si se produce una excepción durante una transacción, no puede hacer commit de la transacción. Esto incluye todas las excepciones, incluidas las excepciones
UNKNOWN_FUNCTIONcausadas por errores tipográficos. - No se admiten transacciones anidadas; en su lugar, finalice la transacción actual e inicie una nueva
Configuración
Habilitar la compatibilidad con transacciones experimentales
/etc/clickhouse-server/config.d/transactions.xml
Configuración básica para un único nodo del servidor ClickHouse con ClickHouse Keeper habilitado
Consulta la documentación de despliegue para obtener más información sobre cómo desplegar el servidor ClickHouse y un quórum adecuado de nodos de ClickHouse Keeper. La configuración que se muestra aquí es solo para fines experimentales.
/etc/clickhouse-server/config.d/config.xml
Ejemplo
Verifica que las transacciones experimentales estén habilitadas
BEGIN TRANSACTION o START TRANSACTION, seguido de un ROLLBACK, para verificar que las transacciones experimentales estén habilitadas y que ClickHouse Keeper también lo esté, ya que se utiliza para hacer el seguimiento de las transacciones.
Cree una tabla para pruebas
Iniciar una transacción e insertar una fila
Puedes consultar la tabla desde dentro de una transacción y ver que la fila se insertó, aunque aún no se haya confirmado.
Revierte la transacción y vuelve a consultar la tabla
Complete la transacción y vuelva a consultar la tabla
Inspección de transacciones
system.transactions, pero tenga en cuenta que no puede consultar esa
tabla desde una sesión que se encuentre dentro de una transacción. Abra una segunda sesión de clickhouse client para consultar esa tabla.