2010-08-23 25 views

Respuesta

91

Ellos son la misma cosa. Si usa la declaración set transaction isolation level, se aplicará a todas las tablas de la conexión, por lo que si solo desea nolock en una o dos tablas, use eso; de lo contrario, usa el otro.

Ambos le darán lecturas sucias. Si estás de acuerdo con eso, entonces úsalos. Si no puede tener lecturas sucias, entonces considere las sugerencias snapshot o serializable.

+0

Considere "REPEATABLE READ" en lugar de "SERIALIZABLE" si no le importan los datos fantasma. 'SERIALIZABLE' es REALMENTE restrictivo y casi nunca debe usarse (excepto, por ejemplo, en algunas aplicaciones financieras críticas). – Kryptos

8

Que yo sepa la única diferencia es el alcance de los efectos como dijo Strommy. NOLOCK insinúa sobre una mesa y LEE NO COMPROMETIDO en la sesión.

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

Personalmente, no creo haber visto ningún problema con esto, pero eso puede deberse más a la forma en que uso nolock. Debe tener en cuenta que hay situaciones en las que se podrá utilizar. Escenarios en los que, en general, agrega datos nuevos a una tabla, pero tiene otro proceso que viene detrás para verificar un escenario de datos. Eso probablemente sea correcto ya que el flujo principal no incluye retroceder y actualizar filas durante una lectura.

También creo que en estos días debe consultar el Control de Concurrencia de varias 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 que deben usar. Voy a incluir un enlace y dejo más investigaciones para el lector:

MVCC

Database Isolation Levels

+0

+1 Aunque no entré en el aspecto "should you" de READ_UNCOMMITTED ", Sean lo cubre muy bien. También hay casos en los que puede leer la misma fila dos veces en SQL Server (debido a divisiones de página). – Anon246

9
  • NOLOCK es local a la mesa (o puntos de vista, etc.)
  • lectura no confirmada es por sesión/conexión

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

+0

La última link "Por qué usar NOLOCK es malo ..." ya no existe. – sangam

+0

interweb eléctrico no tiene precio. Gracias por agregar algo de luz solar a mi día. – JJS

3

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

Olvidarse de un WITH (NOLOCK) puede no afectar su programa de una manera muy dramática, sin embargo, hacer una lectura sucia donde no quiere 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 retrotraerse más tarde. Esto se usa principalmente cuando desea aumentar el rendimiento, y los requisitos en el contexto de la aplicación le permiten correr el riesgo de que se muestren datos incoherentes. Sin embargo, usted o alguien a cargo tiene que sopesar los pros y los contras de la decisión de usar WITH (NOLOCK).

4

No puede usar Establecer nivel de aislamiento de transacciones Leer No confirmado 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.

Cuestiones relacionadas