ver sirven que para niveles los localizar interbloqueos historial evitar eliminar ejemplo datos bloqueos bloqueo aislamiento sql-server sql-server-2005 sql-server-2008 rowlocking

sql-server - sirven - sql server localizar bloqueos



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

Puedo ver cómo desactivar el nivel de fila y el bloqueo de nivel de página en SQL Server, pero no puedo encontrar una forma de obligar a SQL Server a utilizar el bloqueo de nivel de fila. ¿Hay alguna manera de forzar a SQL Server a usar el bloqueo de nivel de fila y NO usar el bloqueo de nivel de página?


Puede usar la sugerencia de ROWLOCK, pero AFAIK SQL puede decidir aumentarla si tiene pocos recursos.

Del doco :

ROWLOCK Especifica que los bloqueos de filas se toman cuando se utilizan ordinariamente bloqueos de página o de tabla. Cuando se especifica en transacciones que operan en el nivel de aislamiento SNAPSHOT, no se toman bloqueos de fila 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 a 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 una instrucción SELECT con una sugerencia de bloqueo manejada por un índice de cobertura, 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 ofrece una explicación bastante detallada sobre la escalada de bloqueo en SQL Server 2005 que se modificó en SQL Server 2008.

También existe, muy en profundidad: Bloqueo en 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 cargar en el servidor puede terminar escalando a un bloqueo de página.



Use la cláusula ALLOW_PAGE_LOCKS de ALTER / CREATE INDEX :

ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF);