En el vasto universo de las bases de datos relacionales, gestionar múltiples operaciones que ocurren al mismo tiempo (transacciones concurrentes) es un desafío fundamental. Los sistemas de gestión de bases de datos (SGBD) implementan mecanismos para controlar cómo estas transacciones interactúan entre sí, garantizando la consistencia y la integridad de los datos. Estos mecanismos se definen a través de los llamados niveles de aislamiento.

Los niveles de aislamiento dictan el grado en que una transacción debe estar aislada de las modificaciones realizadas por otras transacciones concurrentes. El estándar SQL define varios niveles, cada uno ofreciendo un compromiso diferente entre el rendimiento (permitir más concurrencia) y la consistencia de los datos (evitar anomalías). Uno de los niveles más comunes y, a menudo, el predeterminado en muchos SGBD, como PostgreSQL, es el nivel de aislamiento conocido como Lectura Confirmada (Read Committed).
- ¿Qué Significa Lectura Confirmada?
- La Posibilidad de Lecturas No Repetibles
- Manejo de Escrituras Concurrentes (UPDATE, DELETE)
- Ventajas y Casos de Uso de Lectura Confirmada
- Limitaciones y Cuándo Considerar Niveles Superiores
- Preguntas Frecuentes (FAQ) sobre Lectura Confirmada
- ¿Es Read Committed el nivel de aislamiento por defecto en todas las bases de datos?
- ¿Una consulta SELECT en Lectura Confirmada ve datos que otra transacción ha modificado pero aún no ha confirmado?
- ¿Una consulta SELECT en Lectura Confirmada ve cambios que otra transacción confirma *mientras* la consulta SELECT se está ejecutando?
- ¿Una transacción en Lectura Confirmada ve los cambios que ella misma ha hecho, incluso si no han sido confirmados aún?
- ¿Pueden dos consultas SELECT idénticas dentro de la misma transacción obtener resultados diferentes en Lectura Confirmada?
- ¿Qué sucede si dos transacciones intentan actualizar la misma fila simultáneamente en el nivel Lectura Confirmada?
- Conclusión
¿Qué Significa Lectura Confirmada?
El principio fundamental detrás del nivel de aislamiento Lectura Confirmada es que una transacción solo puede ver datos que han sido confirmados (committed) por otras transacciones. Esto significa que previene un tipo de anomalía conocido como Lecturas Sucias (Dirty Reads), donde una transacción lee datos que han sido escritos por otra transacción pero que aún no han sido confirmados. Si esa segunda transacción falla o se deshace (rollback), los datos leídos por la primera transacción serían inválidos.
Cuando una transacción se ejecuta bajo el nivel Lectura Confirmada, cualquier consulta SELECT dentro de esa transacción "congela" su vista de los datos en el momento en que la consulta individual comenzó. Esto significa que una consulta SELECT verá todos los datos que habían sido confirmados en la base de datos justo antes de que la consulta comenzara a ejecutarse. No verá ningún dato que esté siendo modificado por otras transacciones que aún no han confirmado sus cambios, ni verá los cambios que otras transacciones confirmen *mientras* esta consulta SELECT se está ejecutando.
Sin embargo, es crucial entender una particularidad importante: una transacción bajo Lectura Confirmada *sí* verá los cambios realizados por sentencias anteriores *dentro de la misma transacción*, incluso si esos cambios aún no han sido confirmados por la transacción en sí. Estos cambios locales son inmediatamente visibles para las consultas subsiguientes dentro de la misma unidad de trabajo.
La Posibilidad de Lecturas No Repetibles
Aunque Lectura Confirmada previene las Lecturas Sucias, no impide otro tipo de anomalía: las Lecturas No Repetibles (Non-Repeatable Reads). Esto ocurre cuando una transacción ejecuta la misma consulta SELECT dos veces y obtiene resultados diferentes. ¿Cómo es posible si solo ve datos confirmados antes de que la consulta comience?
La clave está en que la "vista congelada" se aplica a la *consulta individual*, no a la *transacción completa*. Si entre la ejecución de la primera consulta SELECT y la segunda consulta SELECT (ambas dentro de la misma transacción), otra transacción concurrente confirma cambios en los datos que la consulta está leyendo, la segunda SELECT verá esos nuevos datos confirmados. Por lo tanto, la misma fila podría aparecer con valores diferentes, o incluso desaparecer (si fue eliminada), entre dos lecturas dentro de la misma transacción. Este comportamiento es una característica definitoria de Lectura Confirmada y una de las principales razones por las que podría no ser adecuado para todas las aplicaciones.
Manejo de Escrituras Concurrentes (UPDATE, DELETE)
El nivel Lectura Confirmada también define un comportamiento específico cuando múltiples transacciones concurrentes intentan modificar la misma fila de datos. Supongamos que una transacción (Transacción A) está actualizando una fila, pero aún no ha confirmado sus cambios. Si otra transacción (Transacción B) intenta actualizar, eliminar o incluso seleccionar para actualización (SELECT FOR UPDATE) esa *misma* fila, Transacción B no procederá inmediatamente. En su lugar, Transacción B esperará a que Transacción A confirme o deshaga sus cambios.
Si Transacción A se deshace (rollback), liberando el bloqueo sobre la fila, Transacción B podrá proceder a realizar su operación sobre la versión original de la fila (la que existía antes de los cambios de Transacción A).
Si Transacción A confirma sus cambios (commit), y la fila aún existe (es decir, Transacción A no la eliminó), Transacción B, que estaba esperando, no simplemente aplicará su cambio sobre la versión que intentó leer inicialmente. En su lugar, el SGBD re-ejecutará la condición de búsqueda de la sentencia de Transacción B (UPDATE, DELETE, etc.) *para esa fila específica*, pero usando la *nueva versión* de la fila que ha sido confirmada por Transacción A. Si la nueva versión de la fila aún cumple la condición de búsqueda de Transacción B, entonces Transacción B procederá a actualizar (o eliminar, o marcar para actualización) esa fila, utilizando la versión recién confirmada por Transacción A como punto de partida para su propia modificación.
Este mecanismo asegura que las escrituras concurrentes en la misma fila no se pierdan tontamente y que la segunda escritura se aplique sobre la versión más reciente y confirmada de la fila. Además, una vez que Transacción B ha aplicado su cambio (doble actualización de la fila en nuestro ejemplo), este cambio realizado por Transacción B será visible para las sentencias SELECT subsiguientes dentro de la *misma* Transacción B, siguiendo la regla de visibilidad de los cambios locales.
Ventajas y Casos de Uso de Lectura Confirmada
Lectura Confirmada es un nivel de aislamiento popular por varias razones. Ofrece un buen equilibrio entre consistencia y rendimiento. Al prevenir las lecturas sucias, garantiza que las transacciones no actúen sobre datos potencialmente inválidos. Su implementación suele ser eficiente, ya que los bloqueos necesarios suelen ser de corta duración (a nivel de fila y solo durante la operación de lectura o escritura, no durante toda la transacción) y no requieren mantener múltiples versiones de los datos de forma tan estricta como niveles superiores.
Para muchas aplicaciones web y sistemas transaccionales donde la mayoría de las operaciones son consultas cortas y actualizaciones puntuales, Lectura Confirmada proporciona una consistencia adecuada. La posibilidad de lecturas no repetibles a menudo no es un problema grave en estos escenarios, ya que la probabilidad de que otra transacción modifique *exactamente* la fila que se está re-leyendo dentro de una transacción muy corta es baja, o la aplicación cliente puede manejar la eventual inconsistencia temporal.
Limitaciones y Cuándo Considerar Niveles Superiores
A pesar de sus ventajas, Lectura Confirmada tiene sus limitaciones. Como mencionamos, no evita las lecturas no repetibles. Tampoco evita otra anomalía conocida como Lecturas Fantasma (Phantom Reads), donde la ejecución repetida de una consulta que recupera un conjunto de filas (por ejemplo, SELECT COUNT(*) FROM tabla WHERE condicion) produce resultados diferentes porque otras transacciones han insertado o eliminado filas que cumplen la condición.
Para aplicaciones que realizan análisis complejos, informes largos, o que requieren una visión absolutamente consistente de los datos a lo largo de una transacción extendida (donde cada lectura debe ser idéntica a lecturas anteriores), el nivel Lectura Confirmada puede no ser suficiente. En estos casos, podría ser necesario recurrir a niveles de aislamiento superiores, como Repetible (Repeatable Read) o Serializable (Serializable), que ofrecen garantías de consistencia más estrictas a expensas de una mayor contención y un menor rendimiento debido a bloqueos más restrictivos o al uso intensivo de control de concurrencia multiversión (MVCC).
Preguntas Frecuentes (FAQ) sobre Lectura Confirmada
¿Es Read Committed el nivel de aislamiento por defecto en todas las bases de datos?
No en todas, pero es muy común y es el predeterminado en SGBD populares como PostgreSQL, Oracle y SQL Server. Otros, como MySQL (con el motor InnoDB), tienen Repeatable Read como defecto.
¿Una consulta SELECT en Lectura Confirmada ve datos que otra transacción ha modificado pero aún no ha confirmado?
No. Esto es precisamente lo que previene Lectura Confirmada (evita las lecturas sucias).
¿Una consulta SELECT en Lectura Confirmada ve cambios que otra transacción confirma *mientras* la consulta SELECT se está ejecutando?
No. La consulta toma una "instantánea" de los datos confirmados al momento de su inicio.
¿Una transacción en Lectura Confirmada ve los cambios que ella misma ha hecho, incluso si no han sido confirmados aún?
Sí. Los cambios realizados por sentencias anteriores dentro de la misma transacción son visibles para las sentencias subsiguientes dentro de esa transacción.
¿Pueden dos consultas SELECT idénticas dentro de la misma transacción obtener resultados diferentes en Lectura Confirmada?
Sí. Si otra transacción confirma cambios entre las dos consultas SELECT, la segunda consulta podría ver los datos modificados o eliminados, lo que resulta en una lectura no repetible.
¿Qué sucede si dos transacciones intentan actualizar la misma fila simultáneamente en el nivel Lectura Confirmada?
Una de las transacciones obtendrá un bloqueo y la otra esperará. Si la primera confirma, la segunda re-evaluará su condición sobre la fila recién actualizada y, si procede, aplicará su cambio sobre esa nueva versión. Si la primera se deshace, la segunda procederá sobre la versión original de la fila.
Conclusión
El nivel de aislamiento Lectura Confirmada es una opción robusta y eficiente para muchas aplicaciones de bases de datos. Al prevenir las peligrosas lecturas sucias y ofrecer un manejo razonable de las escrituras concurrentes en la misma fila, proporciona un buen equilibrio entre la consistencia de los datos y el rendimiento del sistema. Aunque permite anomalías como las lecturas no repetibles, estas a menudo son aceptables o manejables en el contexto de transacciones cortas y aplicaciones típicas. Comprender cómo funciona Lectura Confirmada es fundamental para cualquier desarrollador o administrador de bases de datos, especialmente porque es el comportamiento por defecto que encontrarán en muchos entornos de producción. Para escenarios que exigen una consistencia más estricta a lo largo de transacciones prolongadas, será necesario explorar y configurar niveles de aislamiento superiores.
Si quieres conocer otros artículos parecidos a SQL: Entendiendo Lectura Confirmada puedes visitar la categoría Bases de datos.

Aprende mas sobre MySQL