4.4. Niveles de aislamiento

Las transacciones especifican un nivel de aislamiento que define el grado en que se debe aislar una transacción de las modificaciones de recursos o datos realizadas por otras transacciones. Los niveles de aislamiento se describen en cuanto a los efectos secundarios de la simultaneidad que se permiten, como las lecturas desfasadas o ficticias.

Control de los niveles de aislamiento de transacción:

El nivel de aislamiento para una sesión SQL establece el comportamiento de los bloqueos para las instrucciones SQL.

El estándar ANSI/ISO SQL define cuatro niveles de aislamiento transaccional en función de tres eventos que son permitidos o no dependiendo del nivel de aislamiento. Estos eventos son:

Lectura sucia. Las sentencias SELECT son ejecutadas sin realizar bloqueos, pero podría usarse una versión anterior de un registro. Por lo tanto, las lecturas no son consistentes al usar este nivel de aislamiento.

Lectura norepetible. Una transacción vuelve a leer datos que previamente había leído y encuentra que han sido modificados o eliminados por una transacción cursada.

Lectura fantasma. Una transacción vuelve a ejecutar una consulta, devolviendo un conjuto de registros que satisfacen una condición de búsqueda y encuentra que otros registro que satisfacen la condición han sido insertadas por otra transacción cursada.

Los niveles de aislamiento SQL son definidos basados en si ellos permiten a cada uno de los eventos definidos anteriormente. Es interesante notar que el estándar SQL no impone un esquema de cierre específico o confiere por mandato comportamientos particulares, pero más bien describe estos niveles de aislamiento en términos de estos teniendo muchos mecanismos de cierre/coincidencia, que dependen del evento de lectura.

Concurrencia Oracle

La ejecución concurrente de varias transacciones debe garantizar que producirán el mismo resultado que las mismas en serie.

En general, las BD multi-usuarios utilizan bloqueos en el control de concurrencia. Niveles de bloqueo:

Control de concurrencia multiversión

Oracle automáticamente proporciona consistencia de lectura: datos que una consulta ve son de un mismo punto en el tiempo (consistencia de lectura a nivel de sentencia).

También puede proporcionar consistencia de lectura a todos las consultas de una transacción (consistencia a nivel de transacción).

¿Cómo?

Oracle proporciona consistencia de lectura a dos niveles:

Nivel de sentencia:

Nivel de transacción:

Oracle proporciona tres niveles de aislamiento:

Para seleccionar uno de estos comandos al comienzo de una transacción:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET TRANSACTION ISOLATION LEVEL READ ONLY;

Para establecer un nivel de aislamiento para el conjunto de transacciones siguientes:

ALTER SESSION SET ISOLATION_LEVEL SERIALIZABLE;
ALTER SESSION SET ISOLATION_LEVEL READ COMMITTED;

Elección de un nivel de aislamiento: los dos niveles siguientes proporcionan un alto grado de concurrencia mediante la combinación de multiversión y bloqueos.

read-committed:

serializable:

Bloqueos en Oracle

Bloqueos son los mecanismos que utiliza Oracle para evitar que dos transacciones accedan al mismo recurso.

Automáticamente Oracle obtiene los bloqueos necesarios cuando ejecuta alguna sentencia en SQL.

ORACLE utiliza el nivel menos restrictivo guiándose por las siguientes reglas:

Se utilizan bloqueos a nivel de fila: una transacción espera cuando intenta modificar una fila modificada por una transacción no confirmada.

ORACLE no escalona los bloqueo.

Interbloqueos: ocurren cuando dos o más usuarios están esperando datos bloqueados por los otros. Oracle automáticamente detecta situaciones de interbloqueo y los resuelve abortando una de las transacciones. Se detectan mediante grafos de esperas.