> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-parallel-read-in-order-multi-part.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Comprenda las garantías de inserción de ClickHouse y las transacciones experimentales, y cuándo usar ClickHouse Managed Postgres para cargas de trabajo transaccionales.

# Compatibilidad transaccional (ACID)

export const CloudNotSupportedBadge = () => {
  return <a href="https://clickhouse.com/docs/products/cloud/guides/cloud-compatibility#list-of-unsupported-features" className="cloudNotSupportedBadge">
            <div className="cloudNotSupportedIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.5" d="M6.33366 12.6666L12.3739 12.6667C13.6593 12.6667 14.7073 11.6187 14.7073 10.3334C14.7073 9.04804 13.6593 8.00003 12.3739 8.00003C12.3739 8.00003 12.3337 7.66659 12.0003 7.33325M10.667 5.33322C8.00033 2.33325 4.45395 4.78537 4.14195 6.68203C2.55728 6.7627 1.29395 8.06203 1.29395 9.6667C1.29395 11.3234 2.66699 12.6666 4.00033 12.6666" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.5" d="M2.66699 14L12.0003 4.66663" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>

        </div>
            No es compatible con ClickHouse Cloud
        </a>;
};

export const ExperimentalBadge = () => {
  return <a href="https://clickhouse.com/docs/reference/settings/beta-and-experimental-features#experimental-features" className="experimentalBadge">
            <div className="experimentalIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.25" d="M5.5 2H10.5" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.25" d="M9.50015 2V6.19625L13.4283 12.7425C13.4738 12.8183 13.4985 12.9049 13.4996 12.9934C13.5008 13.0818 13.4785 13.169 13.435 13.246C13.3914 13.323 13.3283 13.3871 13.2519 13.4317C13.1755 13.4764 13.0886 13.4999 13.0002 13.5H3.00015C2.91164 13.5 2.8247 13.4766 2.74822 13.432C2.67174 13.3874 2.60847 13.3233 2.56487 13.2463C2.52126 13.1693 2.49889 13.082 2.50004 12.9935C2.50119 12.905 2.52582 12.8184 2.5714 12.7425L6.50015 6.19625V2" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.25" d="M4.47656 9.56754C5.30344 9.41254 6.47656 9.47942 7.99969 10.25C10.0153 11.2707 11.4216 11.0569 12.2184 10.7282" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>
        </div>
            Funcionalidad experimental
        </a>;
};

Esta página describe las garantías transaccionales en la base de datos analítica ClickHouse, incluidas las garantías de inserción y la compatibilidad experimental con transacciones que abarcan varias sentencias.

<Tip>
  **¿Buscas una base de datos para cargas de trabajo transaccionales (OLTP)?**

  Para aplicaciones que necesitan lecturas y escrituras frecuentes de registros individuales, usa [ClickHouse Managed Postgres](/es/products/managed-postgres/overview) como sistema de registro de tu aplicación y añade ClickHouse para analítica replicando los cambios confirmados con ClickPipes. [Descubre cómo funcionan juntos Postgres y ClickHouse](/es/products/managed-postgres/overview#transactions-and-analytics).
</Tip>

Si quieres comprobar la atomicidad, el aislamiento o la durabilidad de las inserciones en ClickHouse, continúa con los casos que figuran a continuación.

<h2 id="case-1-insert-into-one-partition-of-one-table-of-the-mergetree-family">
  Caso 1: INSERT en una partición de una tabla de la familia MergeTree\*
</h2>

Esto es transaccional (ACID) si las filas insertadas están compactadas y se insertan como un único bloque (consulta las notas):

* 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](https://en.wikipedia.org/wiki/Snapshot_isolation), mientras que los clientes fuera de una transacción tienen el nivel de aislamiento [read uncommitted](https://en.wikipedia.org/wiki/Isolation_\(database_systems\)#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ón `fsync_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).

<h2 id="case-2-insert-into-multiple-partitions-of-one-table-of-the-mergetree-family">
  Caso 2: INSERT en varias particiones de una tabla de la familia MergeTree\*
</h2>

Igual que en el caso 1 anterior, con este detalle:

* Si la tabla tiene muchas particiones y el INSERT abarca varias particiones, la inserción en cada partición es transaccional por separado

<h2 id="case-3-insert-into-one-distributed-table-of-the-mergetree-family">
  Caso 3: INSERT en una tabla distribuida de la familia MergeTree\*
</h2>

Igual que el caso 1 anterior, con este detalle:

* Un INSERT en una tabla Distributed no es transaccional en su conjunto, mientras que la inserción en cada segmento sí lo es

<h2 id="case-4-using-a-buffer-table">
  Caso 4: Uso de una tabla Buffer
</h2>

* las inserciones en tablas Buffer no son atómicas, aisladas, consistentes ni duraderas

<h2 id="case-5-using-async_insert">
  Caso 5: Uso de async\_insert
</h2>

Igual que el caso 1 anterior, con este detalle:

* la atomicidad está garantizada incluso si `async_insert` está habilitado y `wait_for_async_insert` está configurado en 1 (valor predeterminado), pero si `wait_for_async_insert` está configurado en 0, la atomicidad no está garantizada.

<h2 id="notes">
  Notas
</h2>

* 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_size` filas (\~1 000 000 de forma predeterminada) o menos de `min_chunk_bytes_for_parallel_parsing` bytes (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 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](https://en.wikipedia.org/wiki/Multiversion_concurrency_control) con [aislamiento de instantánea](https://en.wikipedia.org/wiki/Snapshot_isolation) 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](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)

<h2 id="transactions-commit-and-rollback">
  Transacciones, Commit y Rollback
</h2>

<ExperimentalBadge />

<CloudNotSupportedBadge />

Además de la funcionalidad descrita al inicio de este documento, ClickHouse ofrece compatibilidad experimental para transacciones y operaciones de commit y rollback.

Para cargas de trabajo de aplicaciones, considere [ClickHouse Managed Postgres](/es/products/managed-postgres/overview#transactions-and-analytics).

<h3 id="requirements">
  Requisitos
</h3>

* 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`:
  ```xml theme={null}
  <clickhouse>
    <allow_experimental_transactions>1</allow_experimental_transactions>
  </clickhouse>
  ```

<h3 id="notes-1">
  Notas
</h3>

* 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_FUNCTION` causadas por errores tipográficos.
* No se admiten transacciones anidadas; en su lugar, finalice la transacción actual e inicie una nueva

<h3 id="configuration">
  Configuración
</h3>

Estos ejemplos corresponden a un servidor ClickHouse de un solo nodo con ClickHouse Keeper habilitado.

<h4 id="enable-experimental-transaction-support">
  Habilitar la compatibilidad con transacciones experimentales
</h4>

```xml title=/etc/clickhouse-server/config.d/transactions.xml theme={null}
<clickhouse>
    <allow_experimental_transactions>1</allow_experimental_transactions>
</clickhouse>
```

<h4 id="basic-configuration-for-a-single-clickhouse-server-node-with-clickhouse-keeper-enabled">
  Configuración básica para un único nodo del servidor ClickHouse con ClickHouse Keeper habilitado
</h4>

<Note>
  Consulta la documentación de [despliegue](/es/guides/oss/deployment-and-scaling/terminology) 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.
</Note>

```xml title=/etc/clickhouse-server/config.d/config.xml theme={null}
<clickhouse replace="true">
    <logger>
        <level>debug</level>
        <log>/var/log/clickhouse-server/clickhouse-server.log</log>
        <errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>
        <size>1000M</size>
        <count>3</count>
    </logger>
    <display_name>node 1</display_name>
    <listen_host>0.0.0.0</listen_host>
    <http_port>8123</http_port>
    <tcp_port>9000</tcp_port>
    <zookeeper>
        <node>
            <host>clickhouse-01</host>
            <port>9181</port>
        </node>
    </zookeeper>
    <keeper_server>
        <tcp_port>9181</tcp_port>
        <server_id>1</server_id>
        <log_storage_path>/var/lib/clickhouse/coordination/log</log_storage_path>
        <snapshot_storage_path>/var/lib/clickhouse/coordination/snapshots</snapshot_storage_path>
        <coordination_settings>
            <operation_timeout_ms>10000</operation_timeout_ms>
            <session_timeout_ms>30000</session_timeout_ms>
            <raft_logs_level>information</raft_logs_level>
        </coordination_settings>
        <raft_configuration>
            <server>
                <id>1</id>
                <hostname>clickhouse-keeper-01</hostname>
                <port>9234</port>
            </server>
        </raft_configuration>
    </keeper_server>
</clickhouse>
```

<h3 id="example">
  Ejemplo
</h3>

<h4 id="verify-that-experimental-transactions-are-enabled">
  Verifica que las transacciones experimentales estén habilitadas
</h4>

Ejecuta un `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.

```sql theme={null}
BEGIN TRANSACTION
```

```response theme={null}
Ok.
```

<Tip>
  Si aparece el siguiente error, revisa el archivo de configuración para asegurarte de que `allow_experimental_transactions` esté establecido en `1` (o en cualquier valor distinto de `0` o `false`).

  ```response theme={null}
  Code: 48. DB::Exception: Received from localhost:9000.
  DB::Exception: Transactions are not supported.
  (NOT_IMPLEMENTED)
  ```

  También puedes comprobar ClickHouse Keeper ejecutando lo siguiente:

  ```bash theme={null}
  echo ruok | nc localhost 9181
  ```

  ClickHouse Keeper debería responder con `imok`.
</Tip>

```sql theme={null}
ROLLBACK
```

```response theme={null}
Ok.
```

<h4 id="create-a-table-for-testing">
  Cree una tabla para pruebas
</h4>

<Tip>
  La creación de tablas no es transaccional. Ejecute esta consulta DDL fuera de una transacción.
</Tip>

```sql theme={null}
CREATE TABLE mergetree_table
(
    `n` Int64
)
ENGINE = MergeTree
ORDER BY n
```

```response theme={null}
Ok.
```

<h4 id="begin-a-transaction-and-insert-a-row">
  Iniciar una transacción e insertar una fila
</h4>

```sql theme={null}
BEGIN TRANSACTION
```

```response theme={null}
Ok.
```

```sql theme={null}
INSERT INTO mergetree_table FORMAT Values (10)
```

```response theme={null}
Ok.
```

```sql theme={null}
SELECT *
FROM mergetree_table
```

```response theme={null}
┌──n─┐
│ 10 │
└────┘
```

<Note>
  Puedes consultar la tabla desde dentro de una transacción y ver que la fila se insertó, aunque aún no se haya confirmado.
</Note>

<h4 id="rollback-the-transaction-and-query-the-table-again">
  Revierte la transacción y vuelve a consultar la tabla
</h4>

Verifica que la transacción se haya revertido:

```sql theme={null}
ROLLBACK
```

```response theme={null}
Ok.
```

```sql theme={null}
SELECT *
FROM mergetree_table
```

```response theme={null}
Ok.

0 rows in set. Elapsed: 0.002 sec.
```

<h4 id="complete-a-transaction-and-query-the-table-again">
  Complete la transacción y vuelva a consultar la tabla
</h4>

```sql theme={null}
BEGIN TRANSACTION
```

```response theme={null}
Ok.
```

```sql theme={null}
INSERT INTO mergetree_table FORMAT Values (42)
```

```response theme={null}
Ok.
```

```sql theme={null}
COMMIT
```

```response theme={null}
Ok. Elapsed: 0.002 sec.
```

```sql theme={null}
SELECT *
FROM mergetree_table
```

```response theme={null}
┌──n─┐
│ 42 │
└────┘
```

<h3 id="transactions-introspection">
  Inspección de transacciones
</h3>

Puede inspeccionar las transacciones consultando la tabla `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.

```sql theme={null}
SELECT *
FROM system.transactions
FORMAT Vertical
```

```response theme={null}
Row 1:
──────
tid:         (33,61,'51e60bce-6b82-4732-9e1d-b40705ae9ab8')
tid_hash:    11240433987908122467
elapsed:     210.017820947
is_readonly: 1
state:       RUNNING
```

<h2 id="more-details">
  Más detalles
</h2>

Consulta este [meta issue](https://github.com/ClickHouse/ClickHouse/issues/48794) para ver pruebas mucho más exhaustivas y mantenerte al día sobre los avances.
