Niveles de aislamiento de transacción (ODBC)

Los niveles de aislamiento de transacción son una medida de hasta qué punto el aislamiento de transacciones se realiza correctamente. En concreto, los niveles de aislamiento de transacción se definen mediante la presencia o ausencia de los siguientes fenómenos:

  • Lecturas de datos sucios Una lectura de datos sucios se produce cuando una transacción lee datos que aún no han sido confirmados. Por ejemplo, supongamos que la transacción 1 actualiza una fila. La transacción 2 lee la fila actualizada antes de que la transacción 1 confirme la actualización. Si la transacción 1 revierte el cambio, la transacción 2 tendrá datos de lectura que se consideran que nunca han existido.

  • Lecturas no replicables Una lectura no replicable se produce cuando una transacción lee la misma fila dos veces, pero obtiene datos diferentes cada vez. Por ejemplo, supongamos que la transacción 1 lee una fila. La transacción 2 actualiza o elimina esa fila y confirma la actualización o eliminación. Si la transacción 1 vuelve a leer la fila, recupera valores de fila diferentes o detecta que se ha eliminado la fila.

  • Fantasmas Un fantasma es una fila que coincide con los criterios de búsqueda, pero no se ve inicialmente. Por ejemplo, supongamos que la transacción 1 lee un conjunto de filas que cumplen algunos criterios de búsqueda. La transacción 2 genera una nueva fila (mediante una actualización o una inserción) que coincide con los criterios de búsqueda de la transacción 1. Si la transacción 1 vuelve a ejecutar la instrucción que lee las filas, obtiene un conjunto diferente de filas.

Los cuatro niveles de aislamiento de transacción (como se define en SQL-92) se definen en términos de estos fenómenos. En la tabla siguiente, una "X" marca cada fenómeno que puede producirse.

Nivel de aislamiento de transacción Lecturas de datos sucios Lecturas no repetibles Fantasmas
Lectura no confirmada X X X
Lectura confirmada -- X X
Lectura repetible -- -- X
Serializable -- -- --

En la tabla siguiente se describen formas sencillas de que un DBMS podría implementar los niveles de aislamiento de transacciones.

Importante

La mayoría de los DBMS usan esquemas más complejos que estos para aumentar la simultaneidad. Estos ejemplos se proporcionan únicamente con fines ilustrativos. En concreto, ODBC no prescribe cómo las DBMS concretas aíslan las transacciones entre sí.

Aislamiento de transacción Implementación posible
Lectura no confirmada Las transacciones no están aisladas entre sí. Si DBMS admite otros niveles de aislamiento de transacciones, omite el mecanismo que usa para implementar esos niveles. Para que no afecten negativamente a otras transacciones, las transacciones que se ejecutan en el nivel Read Uncommitted suelen ser de solo lectura.
Lectura confirmada La transacción espera hasta que se desbloquean las filas bloqueadas por escritura en otras transacciones; esto impide que lea los datos "sucios".

La transacción contiene un bloqueo de lectura (si solo lee la fila) o el bloqueo de escritura (si actualiza o elimina la fila) en la fila actual para evitar que otras transacciones se actualicen o eliminen. La transacción libera bloqueos de lectura cuando se mueve fuera de la fila actual. Contiene bloqueos de escritura hasta que se confirma o se revierte.
Lectura repetible La transacción espera hasta que se desbloquean las filas bloqueadas por escritura en otras transacciones; esto impide que lea los datos "sucios".

La transacción contiene bloqueos de lectura en todas las filas que devuelve a la aplicación y escribe bloqueos en todas las filas que inserta, actualiza o elimina. Por ejemplo, si la transacción incluye la instrucción SQL SELECT * FROM Orders, las filas de bloqueo de lectura de transacción a medida que la aplicación las recupera. Si la transacción incluye la instrucción SQL DELETE FROM Orders WHERE Status = 'CLOSED', la transacción escribe filas a medida que las elimina.

Dado que otras transacciones no pueden actualizar ni eliminar estas filas, la transacción actual evita las lecturas no actualizables. La transacción libera sus bloqueos cuando es confirmada o revertida.
Serializable La transacción espera hasta que se desbloquean las filas bloqueadas por escritura en otras transacciones; esto impide que lea los datos "sucios".

La transacción contiene un bloqueo de lectura (si solo lee filas) o un bloqueo de escritura (si puede actualizar o eliminar filas) en el intervalo de filas que afecta. Por ejemplo, si la transacción incluye la instrucción SQL SELECT * FROM Orders, el intervalo es toda la tabla Orders; la transacción bloquea la tabla y no permite insertar ninguna fila nueva en ella. Si la transacción incluye la instrucción SQL DELETE FROM Orders WHERE Status = 'CLOSED', el intervalo es todas las filas con un estado "CLOSED"; la transacción escribe y bloquea todas las filas de la tabla Orders con un estado "CLOSED" y no permite que se inserten o actualicen filas de modo que la fila resultante tenga el estado "CLOSED".

Dado que otras transacciones no pueden actualizar ni eliminar las filas del intervalo, la transacción actual evita las lecturas no actualizables. Dado que otras transacciones no pueden insertar filas en el intervalo, la transacción actual evita fantasmas. La transacción libera su bloqueo cuando es confirmada o revertida.

Es importante tener en cuenta que el nivel de aislamiento de transacción no afecta a la capacidad de una transacción para ver sus propios cambios; las transacciones siempre pueden ver los cambios que realicen. Por ejemplo, una transacción puede constar de dos instrucciones UPDATE , la primera de las cuales aumenta el pago de todos los empleados en un 10 por ciento y la segunda de las cuales establece el pago de cualquier empleado en un importe máximo en ese importe. Esto solo se realiza como una sola transacción porque la segunda instrucción UPDATE puede ver los resultados del primero.