Aislamiento (ACID)

Por ello se necesita añadir lógica adicional al programa que accede a los datos para su funcionamiento correcto.

nivel SERIALIZABLE), reduciendo así la sobrecarga debida a la necesidad de bloqueos por el sistema.

Los niveles de aislamiento están definidos por ANSI/ISO SQL, y se listan a continuación.

Sin embargo, no se gestionan los bloqueos de rango, por lo que las lecturas fantasma pueden ocurrir (ver más abajo).

Al igual ocurría en el nivel anterior, no se gestionan los bloqueos de rango.

Algunos SGBDR requieren sintaxis especial cuando se realiza una operación SELECT que efectúa bloqueos (e.g.

Sin embargo, la definición anterior ha sido criticada en el artículo A Critique of ANSI SQL Isolation Levels por ambigua, y por no reflejar de modo preciso el aislamiento proporcionado por muchas bases de datos: Hay también otras críticas sobre las definiciones de aislamiento SQL de ANSI, en cuanto a que incita a los implementadores a realizar "trabajos sucios": El estándar ANSI/ISO SQL 92 se refiere a tres efectos de lectura diferentes cuando la transacción 1 lee datos que podría haber cambiado la transacción 2.

Las consultas usan esta tabla: Una lectura sucia ocurre cuando se le permite a una transacción la lectura de una fila que ha sido modificada por otra transacción concurrente pero todavía no ha sido cometida.

Pero no existe ningún usuario que tenga la edad de 21, pues la Transacción 2 nunca cometió los cambios.

El efecto de lecturas no repetible puede ocurrir en una implementación de concurrencia mediante bloqueos cuando no se efectúan éstos al hacer un SELECT, o cuando los bloqueos se liberan nada más terminar la operación SELECT.

Cuando se usa el método MVCC, las lecturas no repetibles pueden aparecer cuando se relaja el requisito de que al cometer una transacción afectada por un conflicto esta deba deshacerse.

En el modo READ COMMITTED, la segunda vez que se ejecute la consulta 1, la edad habrá cambiado.

La anomalía de las lecturas fantasma es una caso particular de las lecturas no repetibles cuando la transacción 1 repite una consulta acotada en rango SELECT ... WHERE y, entre ambas operaciones la transacción 2 crea (i.e.

INSERT) nuevas filas (en la misma tabla) que entran dentro de esa cláusula WHERE.

SELECT) pueden efectuar bloqueos (compartidos) en el nivel Read Committed, pero se liberan inmediatamente tras la operación de lectura.