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

¿Es posible forzar el bloqueo de nivel de fila en SQL Server?

Puede usar la sugerencia ROWLOCK, pero AFAIK SQL puede decidir escalarlo si se queda sin recursos

Del doco:

ROWLOCK Especifica que se toman bloqueos de fila cuando normalmente se toman bloqueos de página o tabla. Cuando se especifica en transacciones que operan en el nivel de aislamiento SNAPSHOT, los bloqueos de fila no se toman a menos que ROWLOCK se combine con otras sugerencias de tabla que requieren bloqueos, como UPDLOCK y HOLDLOCK.

y

Las sugerencias de bloqueo ROWLOCK, UPDLOCK Y XLOCK que adquieren bloqueos de nivel de fila pueden colocar bloqueos en claves de índice en lugar de las filas de datos reales. Por ejemplo, si una tabla tiene un índice no agrupado y un índice de cobertura maneja una instrucción SELECT que usa una sugerencia de bloqueo, se adquiere un bloqueo en la clave de índice en el índice de cobertura en lugar de en la fila de datos en la tabla base.

Y finalmente, esto brinda una explicación bastante detallada sobre la escalada de bloqueo en SQL Server 2005, que se modificó en SQL Server 2008.

También está, muy en profundidad:Locking in The Database Engine (en libros en línea)

Entonces, en general

UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93

Debería estar bien, pero dependiendo de los índices y la carga en el servidor, puede terminar escalando a un bloqueo de página.