Saltar al contenido

¿Es la mala práctica NOLOCK (sugerencia del servidor Sql)?

Queremos mostrarte la mejor información que hemos encontrado en línea. Nuestro deseo es que te resulte de utilidad y si deseas comentarnos algo que nos pueda ayudar a mejorar hazlo con libertad.

Solución:

Antes de trabajar en Stack Overflow, estaba en contra NOLOCK en el principal que usted podría potencialmente realizar un SELECT con NOLOCK y obtenga resultados con datos que pueden estar desactualizados o ser inconsistentes. Un factor a tener en cuenta es cuántos registros se pueden insertar/actualizar al mismo tiempo, otro proceso puede estar seleccionando datos de la misma tabla. Si esto sucede con frecuencia, existe una alta probabilidad de interbloqueos a menos que use un modo de base de datos como READ COMMITED SNAPSHOT.

Desde entonces he cambiado mi perspectiva sobre el uso de NOLOCK después de ver cómo puede mejorar SELECT rendimiento, así como eliminar interbloqueos en un servidor SQL cargado masivamente. Hay momentos en los que puede que no le importe que sus datos no estén exactamente comprometidos al 100 % y necesite resultados rápidamente, aunque estén desactualizados.

Hágase una pregunta cuando piense en usar NOLOCK:

¿Mi consulta incluye una tabla que tiene una gran cantidad de INSERT/UPDATE comandos y me importa si los datos devueltos de una consulta pueden faltar estos cambios en un momento dado?

Si la respuesta es no, utilice NOLOCK para mejorar el rendimiento.


Acabo de realizar una búsqueda rápida de la NOLOCK palabra clave dentro del código base para Stack Overflow y encontró 138 instancias, por lo que la usamos en bastantes lugares.

Con la sugerencia NOLOCK, el nivel de aislamiento de transacción para el SELECT declaración es READ UNCOMMITTED. Esto significa que la consulta puede ver datos sucios e inconsistentes.

Esta no es una buena idea para aplicar como regla. Incluso si este comportamiento de lectura sucia está bien para su aplicación basada en web de misión crítica, un escaneo NOLOCK puede causar un error 601 que finalizará la consulta debido al movimiento de datos como resultado de la falta de protección de bloqueo.

Sugiero leer When Snapshot Isolation Helps y When It Hurts: MSDN recomienda usar READ COMMITTED SNAPSHOT en lugar de SNAPSHOT en la mayoría de las circunstancias.

Si no le importan las lecturas sucias (es decir, en una situación predominantemente de LECTURA), entonces NOLOCK está bien.

PEROtenga en cuenta que la mayoría de los problemas de bloqueo se deben a que no tiene los índices “correctos” para la carga de trabajo de su consulta (suponiendo que el hardware esté a la altura).

Y la explicación del gurú fue correcta. Por lo general, es una solución de curita para un problema más serio.

Editar: Definitivamente no estoy sugiriendo que se deba usar NOLOCK. Supongo que debería haber dejado eso obviamente claro. (Solo lo usaría, en circunstancias extremas en las que había analizado que estaba bien). COMO ejemplo, hace un tiempo trabajé en algunos TSQL que habían sido rociados con NOLOCK para tratar de aliviar los problemas de bloqueo. Los eliminé todos, implementé los índices correctos y TODOS los interbloqueos desaparecieron.

Reseñas y valoraciones del artículo

Si conservas algún interrogante y disposición de aumentar nuestro sección te proponemos añadir un informe y con gusto lo leeremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *