Compartir a través de


Niveles de aislamiento de transacciones (ODBC)

Los niveles de aislamiento de transacción son una medida de la medida en la que el aislamiento de transacción 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 sucias Una lectura sucia se produce cuando una transacción lee datos que aún no se han comprometido. 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 actualizables Una lectura no replicable se produce cuando una transacción lee la misma fila dos veces, pero obtiene datos diferentes cada vez. Por ejemplo, imaginemos 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 sucias 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 solo se proporcionan con fines ilustrativos. En concreto, ODBC no prescribe cómo las DBMS concretas aíslan las transacciones entre sí.

Aislamiento de transacciones 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 para escritura por otras transacciones; esto le impide leer 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. Mantiene bloqueos de escritura hasta que se confirma o se realiza un rollback.
Lectura repetible La transacción espera hasta que se desbloqueen las filas bloqueadas por un candado de escritura en otras transacciones; esto impide que lea 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, la transacción bloquea las filas para lectura a medida que la aplicación las captura. Si la transacción incluye la instrucción SQL DELETE FROM Orders WHERE Status = 'CLOSED', la transacción bloquea para escritura las filas mientras las elimina.

Dado que otras transacciones no pueden actualizar ni eliminar estas filas, la transacción actual evita las lecturas no repetibles. La transacción libera sus bloqueos cuando se confirma o se revierte.
Serializable La transacción espera hasta que las filas bloqueadas por otras transacciones se desbloqueen; esto le impide leer 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 insertar ni actualizar ninguna fila 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 repetibles. Dado que otras transacciones no pueden insertar filas en el rango, la transacción actual evita fantasmas. La transacción libera su bloqueo cuando se confirma o se revierte.

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 salario de todos los empleados en un 10 por ciento y la segunda de las cuales ajusta el salario de cualquier empleado que exceda un importe máximo a dicho importe. Esto solo se realiza como una sola transacción porque la segunda instrucción UPDATE puede ver los resultados del primero.