Compartir a través de


Transacciones y modos de bloqueo en Reliable Collections de Azure Service Fabric

Transacción

Una transacción es una secuencia de operaciones realizadas como una sola unidad lógica de trabajo. Exhibe las propiedades comunes de ACID (atomicidad, consistencia, aislamiento y durabilidad) de las transacciones de base de datos:

  • Atomicidad: una transacción debe ser una unidad atómica de trabajo. Es decir, se realizan todas sus modificaciones de datos o ninguna de ellas.
  • Coherencia: Cuando finaliza, una transacción debe dejar todos los datos en un estado coherente. Todas las estructuras de datos internos deben ser correctas al final de la transacción.
  • Aislamiento: Las modificaciones realizadas por transacciones simultáneas se deben aislar de las modificaciones llevadas a cabo por otras transacciones simultáneas. El nivel de aislamiento usado para una operación en una transacción ITransaction lo determina el elemento IReliableState que realiza la operación.
  • Durabilidad: una vez completada una transacción, sus efectos se colocan permanentemente en el sistema. Las modificaciones persisten aún en el caso de producirse un error del sistema.

Niveles de aislamiento

Un nivel de aislamiento define el grado en el que debe aislarse la transacción de las modificaciones que realicen otras transacciones. Hay dos niveles de aislamiento que se admiten en Colecciones confiables:

  • Lectura repetible: especifica que las instrucciones no pueden leer datos que han sido modificados pero aún no se han confirmado en otras transacciones y que ninguna otra transacción puede modificar los datos leídos por la transacción actual hasta que esta finalice.

    • Ventajas de las transacciones de lectura repetible:
      • Menor superficie de memoria que las transacciones de instantáneas
      • Garantiza una devolución coherente de valores para varias lecturas en un momento dado.
    • Consideraciones para las transacciones repetibles de lectura:
      • Las escrituras se bloquean mientras hay una lectura activa de los datos

      • También se bloquean las lecturas mientras haya una escritura activa de datos.

  • Instantánea: especifica que los datos leídos por cualquier instrucción en una transacción son la versión transaccionalmente consistente de los datos que existían al inicio de la transacción. La transacción solo puede reconocer las modificaciones de datos confirmadas antes de la primera lectura de la transacción. Las modificaciones de datos realizadas por otras transacciones después del inicio de la transacción actual no son visibles para las instrucciones que se ejecutan en la transacción actual.

    El efecto es como si las instrucciones de una transacción obtienen una instantánea de los datos confirmados tal como existía al principio de la transacción. Las instantáneas son coherentes en las colecciones de confianza.

    • Ventajas de las transacciones de instantáneas:
      • Permite escrituras incluso cuando se ha leído un valor en una transacción no confirmada
    • Consideraciones para las transacciones de instantáneas:
      • Las transacciones de instantáneas de larga duración pueden dar lugar a una gran superficie de memoria para el servicio a medida que se mueven más valores a la memoria para mantener el aislamiento de instantáneas
      • Las distintas transacciones pueden devolver valores diferentes para los datos de lectura en función de cuándo se tomó la instantánea.

Las colecciones de confianza eligen automáticamente el nivel de aislamiento a utilizar para una determinada operación de lectura en función de la operación y del rol de la réplica en el momento de la creación de la transacción. A continuación se muestra una tabla con los niveles de aislamiento predeterminados para las operaciones del diccionario y cola de confianza.

Operación \ Rol Primario Secundario
Lectura de una sola entidad Lectura repetible Instantánea
Enumeración, recuento Instantánea Instantánea

Nota:

Algunos ejemplos comunes de las operaciones de entidad única son IReliableDictionary.TryGetValueAsync y IReliableQueue.TryPeekAsync.

Tanto el diccionario de confianza como la cola de confianza admiten la Lectura de lo que escribe. Es decir, cualquier escritura dentro de una transacción será visible para una siguiente lectura que pertenezca a la misma transacción.

Ejemplo de comportamiento de lectura repetible

Ejemplo de aislamiento repetible de lectura de colecciones de confianza

En este ejemplo se puede ver que la T2 no puede adquirir un bloqueo en K1 hasta que la T1 se confirme, ya que la T1 tiene actualmente un bloqueo de lectura en la clave.

Ejemplo de comportamiento de una instantánea

Ejemplo de aislamiento de instantáneas en Colecciones Fiables

En este ejemplo puede ver que, aunque T2 ha actualizado el valor de K1 a V6, T2 sigue enumerando K1 como V1 mientras sigue teniendo en cuenta su propio cambio a K2. T3 no se ve afectado, ya que lee las claves que no tienen ningún bloqueo de escritura actual.

Bloqueos

En colecciones de confianza, todas las transacciones implementan un bloqueo riguroso de dos fases: una transacción no libera los bloqueos que ha adquirido hasta que la transacción finaliza con una anulación o una confirmación.

El diccionario de confianza usa el bloqueo de nivel de fila para todas las operaciones de las entidades individuales. Cola de confianza equilibra la simultaneidad para la propiedad FIFO transaccional estricta. La cola de confianza utiliza bloqueos de nivel de operación que permiten una transacción con TryPeekAsync o TryDequeueAsync, y una transacción con EnqueueAsync a la vez. Tenga en cuenta que para conservar FIFO, si TryPeekAsync o TryDequeueAsync observa alguna vez que la cola de confianza está vacía, también bloquearán EnqueueAsync.

Las operaciones de escritura siempre toman bloqueos exclusivos. En el caso de las operaciones de lectura, el bloqueo depende de dos factores:

  • Las operaciones de lectura que se realizan utilizando el aislamiento de instantáneas están libres de bloqueos.
  • Cualquier operación Repeatable Read usa bloqueos compartidos de manera predeterminada.
  • Sin embargo, para cualquier operación de lectura que admita Repeatable Read, el usuario puede solicitar un bloqueo de actualización en lugar del bloqueo compartido. El bloqueo de actualización es un bloqueo asimétrico que se isa para evitar una forma común de interbloqueo que se produce cuando varias transacciones bloquean recursos para una posible actualización en un momento posterior.

La matriz de compatibilidad de bloqueo se puede encontrar en la tabla siguiente:

Solicitud \ concedida Ninguno Compartido Actualizar Exclusivo
Compartido Ningún conflicto Ningún conflicto Conflicto Conflicto
Actualizar Ningún conflicto Ningún conflicto Conflicto Conflicto
Exclusivo Ningún conflicto Conflicto Conflicto Conflicto

El argumento de tiempo de espera en las API de Reliable Collections se usa para la detección de interbloqueos. Por ejemplo, dos transacciones (T1 y T2) están intentando leer y actualizar K1. Es posible que se interbloqueen, ya que ambos terminan teniendo el bloqueo compartido.

En este caso, una o ambas operaciones agotarán el tiempo de espera. En este escenario, un bloqueo de actualización podría impedir dicho interbloqueo.

Pasos siguientes