Buscar..


Sintaxis

  • CONFIGURAR EL NIVEL DE AISLAMIENTO DE TRANSACCIONES {LEER SIN COMPROMISO | LEER COMPROMETIDO | READATABLE LEER | SNAPSHOT | SERIALIZABLE} [; ]

Observaciones

Referencia de MSDN: AJUSTE EL NIVEL DE AISLAMIENTO DE TRANSACCIONES

Leer no comprometido

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Este es el nivel de aislamiento más permisivo, ya que no causa ningún bloqueo. Especifica que las declaraciones pueden leer todas las filas, incluidas las que se han escrito en transacciones pero que aún no se han confirmado (es decir, aún están en transacción). Este nivel de aislamiento puede estar sujeto a "lecturas sucias".

Leer comprometido

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

Este nivel de aislamiento es el segundo más permisivo. Previene lecturas sucias. El comportamiento de READ COMMITTED depende de la configuración de READ_COMMITTED_SNAPSHOT :

  • Si se establece en DESACTIVADO (la configuración predeterminada), la transacción utiliza bloqueos compartidos para evitar que otras transacciones modifiquen las filas utilizadas por la transacción actual, así como para bloquear la lectura de las filas modificadas por otras transacciones.

  • Si se establece en ACTIVADO, la READCOMMITTEDLOCK tabla READCOMMITTEDLOCK se puede usar para solicitar un bloqueo compartido en lugar del control de versiones de la fila para transacciones que se ejecutan en el modo READ COMMITTED .

Nota: READ COMMITTED es el comportamiento predeterminado de SQL Server.

¿Qué son las "lecturas sucias"?

Las lecturas sucias (o lecturas no confirmadas) son lecturas de filas que están siendo modificadas por una transacción abierta.

Este comportamiento se puede replicar utilizando 2 consultas separadas: una para abrir una transacción y escribir algunos datos en una tabla sin confirmar, la otra para seleccionar los datos que se escribirán (pero aún no se han confirmado) con este nivel de aislamiento.

Consulta 1 - Prepare una transacción pero no la termine:

CREATE TABLE dbo.demo (
    col1 INT,
    col2 VARCHAR(255)
);
GO
--This row will get committed normally:
BEGIN TRANSACTION;
    INSERT INTO dbo.demo(col1, col2) 
    VALUES (99, 'Normal transaction');
COMMIT TRANSACTION;
--This row will be "stuck" in an open transaction, causing a dirty read
BEGIN TRANSACTION;
    INSERT INTO dbo.demo(col1, col2) 
    VALUES (42, 'Dirty read');
--Do not COMMIT TRANSACTION or ROLLBACK TRANSACTION here

Consulta 2 : lea las filas que incluyen la transacción abierta:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM dbo.demo;

Devoluciones:

col1        col2
----------- ---------------------------------------
99          Normal transaction
42          Dirty read

PD: No te olvides de limpiar estos datos de demostración:

COMMIT TRANSACTION;
DROP TABLE dbo.demo;
GO

Lectura repetible

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

Este nivel de aislamiento de la transacción es ligeramente menos permisivo que READ COMMITTED , ya que los bloqueos compartidos se colocan en todos los datos leídos por cada declaración en la transacción y se mantienen hasta que la transacción se completa , en lugar de liberarse después de cada declaración.

Nota: use esta opción solo cuando sea necesario, ya que es más probable que cause una degradación del rendimiento de la base de datos, así como puntos muertos que READ COMMITTED .

Instantánea

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL SNAPSHOT

Especifica que los datos leídos por cualquier declaración en una transacción serán la versión consistente de la transacción de los datos que existían al inicio de la transacción, es decir, solo leerán los datos que se hayan confirmado antes de que comience la transacción.

SNAPSHOT transacciones SNAPSHOT no solicitan ni causan ningún bloqueo en los datos que se están leyendo, ya que solo está leyendo la versión (o instantánea) de los datos que existían en el momento en que comenzó la transacción.

Una transacción que se ejecuta en el nivel de aislamiento SNAPSHOT lee solo sus propios cambios de datos mientras se ejecuta. Por ejemplo, una transacción podría actualizar algunas filas y luego leer las filas actualizadas, pero ese cambio solo será visible para la transacción actual hasta que se confirme.


Nota: la opción de la base de datos ALLOW_SNAPSHOT_ISOLATION debe estar activada antes de poder utilizar el nivel de aislamiento SNAPSHOT .

Serializable

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL SERIALIZEABLE

Este nivel de aislamiento es el más restrictivo. El rango de solicitudes bloquea el rango de valores clave que lee cada declaración en la transacción. Esto también significa que las declaraciones INSERT de otras transacciones se bloquearán si las filas que se insertarán están en el rango bloqueado por la transacción actual.

Esta opción tiene el mismo efecto que configurar HOLDLOCK en todas las tablas en todas las declaraciones SELECT en una transacción.


Nota: Este aislamiento de transacción tiene la concurrencia más baja y solo debe usarse cuando sea necesario.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow