Un SELECT
en SQL Server colocará un bloqueo compartido en una fila de la tabla - y un segundo SELECT
también requeriría un candado compartido, y esos son compatibles entre sí.
Así que nadie SELECT
no puede bloquear otro SELECT
.
¿Qué demonios WITH (NOLOCK)
la sugerencia de consulta se usa para poder leer datos que están en proceso de ser insertados (por otra conexión) y que aún no se han confirmado.
Sin esa sugerencia de consulta, un SELECT
podría estar bloqueado al leer una tabla por un INSERT
en curso (o UPDATE
) declaración que coloca un exclusivo bloquear filas (o posiblemente una tabla completa), hasta que la transacción de esa operación se haya confirmado (o revertido).
Problema del WITH (NOLOCK)
la sugerencia es:es posible que esté leyendo filas de datos que no se insertarán en absoluto, al final (si el INSERT
la transacción se revierte), por lo que, p. el informe puede mostrar datos que nunca se han enviado realmente a la base de datos.
Hay otra sugerencia de consulta que podría ser útil:WITH (READPAST)
. Esto instruye al SELECT
comando para omitir las filas que intenta leer y que están bloqueadas exclusivamente. El SELECT
no se bloqueará y no leerá ningún dato "sucio" no confirmado, pero podría omitir algunas filas, p. no mostrar todas sus filas en la tabla.