¿Es posible forzar el bloqueo de filas nivel en SQL Server?
-
29-09-2019 - |
Pregunta
puedo ver cómo apagar el nivel de fila como de páginas de bloqueo en SQL Server, pero no puedo encontrar una manera de forzar SQL Server para el uso de bloqueo a nivel de fila. ¿Hay una manera de forzar SQL Server para utilizar el bloqueo de filas nivel y no usar bloqueo a nivel de página?
Solución
Puede utilizar la sugerencia ROWLOCK, pero que yo sepa SQL puede decidir una escalada que si se ejecuta bajo de recursos
ROWLOCK Especifica que son bloqueos de registro tomada cuando la página o de mesa son cerraduras normalmente tomada. Cuando se especifica en transacciones que operan en el INSTANTÁNEA nivel de aislamiento, bloqueos de registro no están tomado a menos ROWLOCK se combina con otras sugerencias de tabla que requieren cerraduras, tales como UPDLOCK y HOLDLOCK.
y
Bloqueo insinúa ROWLOCK, UPDLOCK, Y XLOCK que adquieren bloqueos a nivel de fila pueden colocar cerraduras de las claves de índice en lugar de la filas de datos reales. Por ejemplo, si una tabla tiene un índice no agrupado, y una instrucción SELECT utilizando una sugerencia de bloqueo es manejado por un índice de cobertura, un bloqueo es adquirida en la clave de índice en el cubriendo índice en lugar de en los datos fila de la tabla base.
Y finalmente esto da una muy profunda explicación acerca de la extensión de bloqueo en SQL Server 2005 que fue cambiado en SQL Server 2008.
Hay también, la misma en profundidad: El bloqueo de motor de base de (en los libros en línea)
Así que, en general
UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93
En caso de estar bien, pero dependiendo de los índices y de carga en el servidor puede terminar la escalada a un bloqueo de página.
Otros consejos
Utilice la cláusula allow_page_locks de ALTER / CREATE INDEX :
ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF);
Se puede en realidad no forzar al optimizador a hacer nada, pero se puede guiarla.
UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93