jueves, 23 de diciembre de 2021

Uso de WITH (NOLOCK) SQL SERVER

 La sugerencia WITH (nolock) es un comando explícito dirigido a una tabla o vista específica que se usa para establecer el nivel de aislamiento de la transacción con respecto a la tabla o tablas dentro de una vista para una consulta. Una vez emitidos, los bloqueos no se utilizarán contra los datos dentro de la tabla. La ventaja de esto es que no hay posibilidad de que se produzca un punto muerto con cualquier otra consulta que se ejecute en la mesa. La otra ventaja indirecta es que se utilizará menos memoria para mantener bloqueos contra esos datos.

SELECT
first_name,
last_name,
FROM dbo.person p WITH (NOLOCK)
JOIN dbo.employee e WITH (NOLOCK)
ON e.person_id = p.person_id
WHERE p.person_id = 1;


La configuración de nolock anterior es explícita para la tabla contra la que se establece. Para establecer el valor globalmente para el alcance de la conexión, consulte ESTABLECER EL NIVEL DE AISLAMIENTO DE LA TRANSACCIÓN

Si bien la palabra clave "WITH" puede no ser necesaria en las versiones actuales de SQL Server, se recomienda encarecidamente su uso para la compatibilidad con versiones futuras.

Ventajas:

  • Los bloqueos mutuos no ocurrirán frente a otras consultas que se ejecutan contra los mismos datos
  • Se utiliza menos memoria debido a la falta de bloqueo de nivel de fila, página o rango
  • Por lo general, permite una simultaneidad mucho mayor debido a una menor huella

Desventajas:

  • Los datos no comprometidos se pueden leer dando lugar a lecturas sucias
  • Las sugerencias explícitas contra una tabla son generalmente una mala práctica

Uso

En la mayoría de los lugares en los que he trabajado, con (nolock) ha sido una práctica generalmente aceptada en las áreas específicas del sistema que no son sensibles a la falta de sincronización de los datos. Sin embargo, es importante saber dónde pueden salir mal las cosas. La señal de alerta más grande que se me ocurre para no usar NOLOCK sería un sistema que usa transacciones explícitas (BEGIN TRAN ..END TRAN) o un uso intensivo de activadores. Varias declaraciones ejecutadas dentro de una transacción experimentan un retraso de tiempo en sus operaciones INSERT / UPDATE / DELETE, sin embargo, los cambios se confirman de una vez en COMMIT. Las declaraciones que consultan los datos modificados utilizando el nivel de aislamiento READ COMMITTED no podrán ver estos cambios hasta que se confirmen, mientras que READ UNCOMMITTED (NOLOCK) verá los cambios inmediatamente independientemente de cuándo se produzca la confirmación.

No use WITH (NOLOCK) sin comprender completamente las ramificaciones de una lectura sucia

No hay comentarios:

Publicar un comentario

Comenta cualquier duda o recomendatorio.