sirve - rowlock sql server
¿Cuál es(son) la diferencia entre NOLOCK y UNCOMMITTED (5)
No hay diferencia en el nivel de declaración.
Puede configurar READUNCOMMITED en el nivel de la sesión y aquí debe escribir SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Yo uso SQL Server 2012.
Escribo dos consultas, pero ¿qué es diferente entre NOLOCK
y UnCommitted
?
SELECT lastname, firstname
FROM HR.Employees with (READUNCOMMITTED)
SELECT lastname, firstname
FROM HR.Employees with (NoLock)
No hay diferencia en términos de sus funciones, como otros han mencionado.
La única diferencia es que puede aplicar WITH(NOLOCK)
selectivamente, en algunas tablas pero no en otras. READ UNCOMMITTED
aplica NOLOCK
a todas las tablas en una sesión.
Si haces esto:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT *
FROM Table1 T1
INNER JOIN Table2 T2 ON T1.ID = T2.id
Es funcionalmente equivalente a:
SELECT *
FROM Table1 T1 WITH(NOLOCK)
INNER JOIN Table2 T2 WITH(NOLOCK) ON T1.ID = T2.ID
Pero también puede aplicar WITH(NOLOCK)
selectivamente:
SELECT *
FROM Table1 T1 WITH(TABLOCK)
INNER JOIN Table2 WITH(NOLOCK) ON T1.ID = T2.ID
NOLOCK: Es equivalente a READUNCOMMITTED
(fuente: MSDN )
NOLOCK
o READUNCOMMITTED
Especifica que las lecturas sucias están permitidas. No se emiten bloqueos compartidos para evitar que otras transacciones modifiquen los datos leídos por la transacción actual y los bloqueos exclusivos establecidos por otras transacciones no bloquean la lectura actual de los datos bloqueados. Permitir lecturas sucias puede causar una mayor concurrencia, pero a costa de leer modificaciones de datos que luego son revertidas por otras transacciones
READUNCOMMITTED
NOLOCK
READUNCOMMITTED
y NOLOCK
aplican solo a los bloqueos de datos. Todas las consultas, incluidas aquellas with READUNCOMMITTED and NOLOCK hints
, adquieren bloqueos Sch-S (estabilidad del esquema) durante la compilación y la ejecución. Debido a esto, las consultas se bloquean cuando una transacción simultánea contiene un bloqueo Sch-M (modificación de esquema) en la tabla
Para NOLOCK, debemos poner esta sugerencia al nivel de la tabla, por lo que es necesario poner para cada nivel de tabla que se usa en la transacción de actualización. Por lo tanto, es muy largo y lento ponerlo en todas partes, las tablas se refieren en la consulta. Para READ UNCOMMITTED, no tenemos que ponerlo en cada nivel de tabla, simplemente ponerlo en el nivel de la sesión o de la consulta y se puede escribir en la parte superior de la consulta o del procedimiento almacenado. Veamos un pequeño demo para elaborarlo. Primero, verificar aquí el nivel de aislamiento predeterminado de la base de datos
CREATE TABLE SAMPLETABLE
(
Col1 INT ,
Col2 VARCHAR(100)
)
INSERT INTO SAMPLETABLE(Col1,Col2)
SELECT 1,''Col1''
Union all
SELECT 2,''Col1''
BEGIN TRANSACTION
Update SAMPLETABLE Set Col2 = ''Value changed'' Where col1 =1
Select * from SAMPLETABLE with (nolock)
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Select * from SAMPLETABLE
La salida es 1, Col1 para ambas consultas
Debajo del capó están realizando la misma acción.
El nivel de aislamiento de read-uncommitted
es el nivel de aislamiento menos restrictivo dentro de SQL Server, que también es lo que lo hace popular para los desarrolladores cuando se busca reducir el bloqueo.
La nolock
tabla nolock
entre bastidores realiza exactamente la misma acción que ejecutar bajo el nivel de aislamiento sin lectura.
La única diferencia entre los dos es que el nivel de aislamiento de read-uncommitted
determina el mecanismo de bloqueo para toda la conexión y la nolock
tabla nolock
determina el mecanismo de bloqueo para la tabla a la que le da la pista.