CON (NOLOCK) vs ESTABLECER NIVEL DE AISLAMIENTO DE TRANSACCIÓN LEER SIN COMPROMISO

118

¿Alguien podría darme alguna orientación sobre cuándo debo usar WITH (NOLOCK)en lugar deSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

¿Cuáles son los pros / contras de cada uno? ¿Hay alguna consecuencia involuntaria con la que se haya encontrado al usar uno en lugar del otro?

Jim B
fuente

Respuestas:

105

Ellos son la misma cosa. Si usa la set transaction isolation levelinstrucción, se aplicará a todas las tablas en la conexión, por lo que si solo desea una nolocken una o dos tablas, úsela; de lo contrario, utilice el otro.

Ambos te darán lecturas sucias. Si está de acuerdo con eso, utilícelos. Si no puede tener lecturas sucias, considere las sugerencias snapshoto en su serializablelugar.

HLGEM
fuente
Considere en REPEATABLE READlugar de SERIALIZABLEsi no le importan los datos fantasma. SERIALIZABLEes REALMENTE restrictivo y casi nunca debe usarse (excepto, por ejemplo, en algunas aplicaciones financieras críticas).
Kryptos
10
  • NOLOCK es local a la mesa (o vistas, etc.)
  • READ UNCOMMITTED es por sesión / conexión

En cuanto a las pautas ... una búsqueda aleatoria de StackOverflow y la interweb eléctrica ...

gbn
fuente
El último enlace "Por qué usar NOLOCK es malo ..." ya no existe.
Sangam
1
la interweb eléctrica no tiene precio. gracias por agregar un poco de sol a mi día.
JJS
9

Que yo sepa, la única diferencia es el alcance de los efectos, como dijo Strommy. Pista NOLOCK en una mesa y READ UNCOMMITTED en la sesión.

En cuanto a los problemas que pueden ocurrir, se trata de coherencia. Si le importa, tenga en cuenta que podría obtener lo que se denomina lecturas sucias que podrían influir en la manipulación de otros datos con información incorrecta.

Personalmente, no creo que haya visto ningún problema con esto, pero puede deberse más a cómo uso nolock. Debe tener en cuenta que hay escenarios en los que estará bien usar. Escenarios en los que principalmente está agregando datos nuevos a una tabla, pero tiene otro proceso que viene detrás para verificar un escenario de datos. Eso probablemente estará bien, ya que el flujo principal no incluye volver atrás y actualizar filas durante una lectura.

También creo que en estos días debería considerar el control de simultaneidad de múltiples versiones. Creo que lo agregaron en 2005 y ayuda a evitar que los escritores bloqueen a los lectores al brindarles a los lectores una instantánea de la base de datos para usar. Incluiré un enlace y dejaré más investigación al lector:

MVCC

Niveles de aislamiento de la base de datos

Sean Copenhaver
fuente
+1 Aunque no me metí en el aspecto "deberías" de READ_UNCOMMITTED ", Sean lo cubre muy bien. También hay casos en los que puedes leer la misma fila dos veces en SQL Server (debido a divisiones de página).
Anon246
6

No puede usar Establecer nivel de aislamiento de transacciones Leer no comprometido en una vista (de hecho, solo puede tener un script allí), por lo que tendría que usar (nolock) si se deben incluir filas sucias.

Rez.Net
fuente
4

Como tiene que usar WITH (NOLOCK) para cada tabla, puede ser molesto escribirlo en cada cláusula FROM o JOIN. Sin embargo, tiene una razón por la que se denomina lectura "sucia". Por lo tanto, debería saber cuándo hace uno y no establecerlo como predeterminado para el alcance de la sesión. ¿Por qué?

Olvidar un WITH (NOLOCK) podría no afectar su programa de una manera muy dramática, sin embargo, hacer una lectura sucia donde no lo desea puede marcar la diferencia en ciertas circunstancias.

Por lo tanto, use WITH (NOLOCK) si se permite que los datos actuales seleccionados sean incorrectos, ya que podrían revertirse más tarde. Esto se utiliza principalmente cuando desea aumentar el rendimiento, y los requisitos del contexto de su aplicación le permiten correr el riesgo de que se muestren datos inconsistentes. Sin embargo, usted o alguien a cargo debe sopesar los pros y los contras de la decisión de usar WITH (NOLOCK).

Alex
fuente