¿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?
sql
sql-server
sql-server-2005
Jim B
fuente
fuente
REPEATABLE READ
lugar deSERIALIZABLE
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).WITH (NOLOCK) es una pista a nivel de mesa. Establecer el nivel de aislamiento de la transacción en READ_UNCOMMITTED afectará la conexión. La diferencia está en términos de alcance. Consulte READUNCOMMITTED y NOLOCK en la documentación de SQL Server aquí:
http://technet.microsoft.com/en-us/library/ms187373.aspx
Para NIVEL DE AISLAMIENTO DE LA TRANSACCIÓN: http://technet.microsoft.com/en-us/library/ms173763.aspx
fuente
En cuanto a las pautas ... una búsqueda aleatoria de StackOverflow y la interweb eléctrica ...
fuente
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
fuente
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.
fuente
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).
fuente