Microsoft SQL Server
Niveles de aislamiento de transacciones.
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
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
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
tablaREADCOMMITTEDLOCK
se puede usar para solicitar un bloqueo compartido en lugar del control de versiones de la fila para transacciones que se ejecutan en el modoREAD 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
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
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
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.