sql >> Base de Datos >  >> RDS >> Sqlserver

Comprender los BLOQUEOS de SQL Server en consultas SELECT

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.