Operaciones por lotes transaccionales en Azure Cosmos DB

SE APLICA A: NoSQL

El lote transaccional describe un grupo de operaciones puntuales que deben finalizar juntas, ya sea correctamente o con errores, con la misma clave de partición en un contenedor. Las operaciones se definen, se agregan al lote y se ejecuta el lote. Si todas las operaciones se realizan correctamente en el orden en que se describen en el lote transaccional, la transacción se confirma. Sin embargo, si se produce un error en alguna de las operaciones, se revierte toda la transacción.

Concepto de transacción en Azure Cosmos DB

Una transacción en una base de datos típica se puede definir como una secuencia de operaciones realizadas como una única unidad lógica de trabajo. Cada transacción ofrece garantías de propiedad ACID (atomicidad, coherencia, aislamiento y durabilidad).

  • La atomicidad garantiza que todas las operaciones realizadas dentro de una transacción se consideran como una única unidad y se confirman todas o ninguna.
  • La coherencia garantiza que los datos se encuentran siempre en un estado válido entre las transacciones.
  • El aislamiento garantiza que dos transacciones no pueden interferir entre ellas; muchos sistemas comerciales proporcionan varios niveles de aislamiento que se pueden utilizar según las necesidades de aplicación.
  • La durabilidad garantiza que cualquier cambio que se confirme en una base de datos estará siempre presente. Azure Cosmos DB es totalmente compatible con transacciones ACID con aislamiento de instantáneas para las operaciones que se encuentran en la misma clave de partición lógica.

Operaciones por lotes transaccionales y procedimientos almacenados

Actualmente, Azure Cosmos DB admite procedimientos almacenados, que también proporcionan el ámbito transaccional en las operaciones. Sin embargo, las operaciones por lotes transaccionales ofrecen las siguientes ventajas:

  • Opción de lenguaje: el lote transaccional es compatible con el SDK y el lenguaje con los que ya trabaja, mientras que los procedimientos almacenados deben escribirse en JavaScript.
  • Control de versiones de código: controlar las versiones del código de la aplicación e incorporarlo en la canalización de CI/CD es mucho más natural que orquestar la actualización de un procedimiento almacenado y asegurar que la sustitución sucede en el momento adecuado. También se facilita la reversión de los cambios.
  • Rendimiento: la latencia en operaciones equivalentes se reduce hasta un 30 % en comparación con la ejecución del procedimiento almacenado.
  • Serialización del contenido: cada operación dentro de un lote transaccional puede usar las opciones de serialización personalizadas para su carga.

Creación de una operación por lotes transaccional

Al crear una operación por lotes transaccional, comience a partir de una instancia de contenedor y llame a CreateTransactionalBatch::

PartitionKey partitionKey = new PartitionKey("road-bikes");

TransactionalBatch batch = container.CreateTransactionalBatch(partitionKey);

A continuación, agregue varias operaciones al lote:

Product bike = new (
    id: "68719520766",
    category: "road-bikes",
    name: "Chropen Road Bike"
);

batch.CreateItem<Product>(bike);

Part part = new (
    id: "68719519885",
    category: "road-bikes",
    name: "Tronosuros Tire",
    productId: bike.id
);

batch.CreateItem<Part>(part);

Por último, llame a ExecuteAsync en el lote:

using TransactionalBatchResponse response = await batch.ExecuteAsync();

Una vez recibida la respuesta, examine si es correcta. En caso afirmativo, extraiga los resultados:

if (response.IsSuccessStatusCode)
{
    TransactionalBatchOperationResult<Product> productResponse;
    productResponse = response.GetOperationResultAtIndex<Product>(0);
    Product productResult = productResponse.Resource;

    TransactionalBatchOperationResult<Part> partResponse;
    partResponse = response.GetOperationResultAtIndex<Part>(1);
    Part partResult = partResponse.Resource;
}

Importante

Si se produce un error en la operación, presentará el código de estado del error correspondiente. Todas las demás operaciones tendrán un código de estado 424 (dependencia con error). Si se produce un error en la operación porque intenta crear un elemento que ya existe, se devuelve un código de estado 409 (conflicto). Los códigos de estado facilitan la identificación de la causa del error de la transacción.