Niveles de aislamiento del motor de base de datos

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:

  • Controla si se realizan bloqueos cuando se leen los datos y qué tipos de bloqueos se solicitan.

  • Duración de los bloqueos de lectura.

  • Si una operación de lectura que hace referencia a filas modificadas por otra transacción:

    • Se bloquea hasta que se libera el bloqueo exclusivo de la fila.

    • Recupera la versión confirmada de la fila que existía en el momento en el que empezó la instrucción o la transacción.

    • Lee la modificación de los datos no confirmados.

La elección de un nivel de aislamiento de transacción no afecta a los bloqueos adquiridos para proteger la modificación de datos. Siempre se obtiene un bloqueo exclusivo en los datos modificados de una transacción, bloqueo que se mantiene hasta que se completa la transacción, independientemente del nivel de aislamiento seleccionado para la misma. En el caso de las operaciones de lectura, los niveles de aislamiento de transacción definen básicamente el nivel de protección contra los efectos de las modificaciones que realizan otras transacciones.

Un nivel de aislamiento menor significa que los usuarios tienen un mayor acceso a los datos simultáneamente, con lo que aumentan los efectos de simultaneidad que pueden experimentar, como las lecturas desfasadas o la pérdida de actualizaciones. Por el contrario, un nivel de aislamiento mayor reduce los tipos de efectos de simultaneidad, pero requiere más recursos del sistema y aumenta las posibilidades de que una transacción bloquee otra. El nivel de aislamiento apropiado depende del equilibrio entre los requisitos de integridad de los datos de la aplicación y la sobrecarga de cada nivel de aislamiento. El nivel de aislamiento superior, que es serializable, garantiza que una transacción recuperará exactamente los mismos datos cada vez que repita una operación de lectura, aunque para ello aplicará un nivel de bloqueo que puede afectar a los demás usuarios en los sistemas multiusuario. El nivel de aislamiento inferior, de lectura sin confirmar, puede recuperar datos modificados pero no confirmados por otras transacciones. En este nivel se pueden producir todos los efectos secundarios de simultaneidad, pero no hay bloqueos ni versiones de lectura, por lo que se minimiza la sobrecarga.

Niveles de aislamiento del motor de base de datos

El estándar ISO define los niveles de aislamiento siguientes, todos ellos compatibles con SQL Server Database Engine (Motor de base de datos de SQL Server):

  • Lectura no confirmada (el nivel más bajo donde se aíslan las transacciones lo suficiente como para garantizar que no se leen datos físicamente dañados)

  • Lectura confirmada (nivel predeterminado del Motor de base de datos)

  • Lectura repetible

  • Serializable (el nivel más alto, en el que se aíslan completamente las transacciones entre sí)

Nota importanteImportante

Al solicitar el nivel de aislamiento serializable se puede producir un error en las operaciones DDL y las transacciones de tablas replicadas. La causa es que en las consultas de replicación se utilizan sugerencias que pueden ser incompatibles con el nivel de aislamiento serializable.

SQL Server también admite dos niveles de aislamiento de transacción que utilizan el control de versiones de filas. Uno es una nueva implementación de aislamiento de lectura confirmada y el otro un nuevo nivel de aislamiento de transacción, la instantánea.

  • Cuando el valor de la opción de base de datos READ_COMMITTED_SNAPSHOT es ON, el aislamiento de lectura confirmada utiliza el control de versiones de filas para proporcionar una coherencia de lectura en las instrucciones. Las operaciones de lectura solo requieren bloqueos de tablas SCH-S, pero no bloqueos de páginas ni filas. Cuando el valor de la opción de base de datos READ_COMMITTED_SNAPSHOT es OFF, que es el predeterminado, el aislamiento de lectura confirmada se comporta como en las versiones anteriores de SQL Server. Ambas implementaciones cumplen la definición ANSI del aislamiento de lectura confirmada.

  • El nivel de aislamiento de instantánea utiliza el control de versiones de filas para proporcionar una coherencia de lectura en las transacciones. No se adquiere ningún bloqueo de páginas ni filas en las operaciones de lectura, solo los bloqueos de tabla SCH-S. Cuando se leen filas modificadas por otras transacciones, se recupera la versión de la fila que existía cuando empezó la transacción. El aislamiento de instantánea solo se puede utilizar en una base de datos cuando la opción de base de datos ALLOW_SNAPSHOT_ISOLATION es ON. De forma predeterminada, el valor de esta opción es OFF para las bases de datos de usuarios.

Nota

SQL Server no permite controlar las versiones de los metadatos. Por ello, hay restricciones en qué operaciones de DDL se puede realizar en una transacción explícita que se está ejecutando bajo el aislamiento de instantánea. Las instrucciones de DDL siguientes no se admiten bajo el aislamiento de instantánea después de una instrucción BEGIN TRANSACTION: ALTER TABLE, CREATE INDEX, CREATE XML INDEX, ALTER INDEX, DROP INDEX, DBCC REINDEX, ALTER PARTITION FUNCTION, ALTER PARTITION SCHEME, ni ninguna instrucción de DDL de Common Language Runtime (CLR). Estas instrucciones se admiten si se está utilizando el aislamiento de instantánea dentro de transacciones implícitas. Una transacción implícita, por definición, es una instrucción única que permite aplicar la semántica del aislamiento de instantánea, incluso con instrucciones de DDL. Las infracciones de este principio pueden producir error 3961: "Error de la transacción de aislamiento de instantánea en la base de datos '%. * ls' porque el objeto al que tuvo acceso la instrucción ha sido modificado por una instrucción DDL de otra transacción simultánea desde el inicio de esta transacción. No se permite porque los metadatos no tienen control de versiones. Una actualización simultánea de los metadatos puede dar lugar a incoherencias si se combina con aislamiento de instantánea."

En la tabla siguiente se muestran los efectos secundarios de la simultaneidad habilitados por los distintos niveles de aislamiento.

Nivel de aislamiento

Lectura desfasada

Lectura no repetible

Ficticia

Lectura no confirmada

Lectura confirmada

No

Lectura repetible

No

No

Instantánea

No

No

No

Serializable

No

No

No

Para obtener más información acerca de los tipos de bloqueo específicos o el control de versiones de filas que controla cada nivel de aislamiento de transacción, vea SET TRANSACTION ISOLATION LEVEL (Transact-SQL).