Veo cómo desactivar el nivel de fila y el bloqueo de nivel de página en SQL Server, pero no encuentro 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?¿Es posible forzar el bloqueo de nivel de fila en SQL Server?
Respuesta
Usted puede utilizar la sugerencia ROWLOCK, pero que yo sepa SQL pueden decidir una escalada que si se ejecuta bajo de recursos
ROWLOCK Especifica que la fila cerraduras son tomada cuando la página o bloqueos de tabla son ordinariamente tomadas. Cuando se especifica en transacciones que operan en el nivel de aislamiento SNAPSHOT , los bloqueos de fila no son tomados a menos que ROWLOCK se combine con otros consejos de tabla que requieren bloqueos, tales como UPDLOCK y HOLDLOCK.
y
bloqueo insinúa ROWLOCK, UPDLOCK, Y XLOCK que adquieren bloqueos a nivel de fila puede colocar cerraduras de las claves de índice en lugar de los filas de datos reales. Por ejemplo, si una tabla tiene un índice no agrupado, y una instrucción SELECT utilizando una sugerencia de bloqueo se manejado por un índice de cobertura, una cerradura se adquirió en la clave de índice en el cubriendo índice en lugar de en los datos fila en la mesa base.
And finally esto da una explicación muy detallada acerca de la extensión de bloqueo en SQL Server 2005 que fue cambiado en SQL Server 2008.
Existe también, la misma en profundidad: Locking in The Database Engine (en los libros en línea)
por lo tanto, en general
UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93
debería estar bien, pero dependiendo de los índices y de carga en el servidor puede terminar la escalada a un bloqueo de página.
solo para agregar, en el servidor sql 2008+ puede DESACTIVAR efectivamente la escalada de bloqueo con 'ALTER TABLE tableName SET (LOCK_ESCALATION = DISABLE)' –
[basado en sus comentarios a Remus Rusanu] significa que no hay nada que podamos hacer para bloquear una fila en todo, ¿cómo lo hace Oracle? – bjan
@bjan no estoy seguro, en general, la naturaleza de snapshot de Oracle significa que es menos propenso a este tipo de bloqueo de todas formas. En general, evitaría cualquier sugerencia de rowlock. Casi nunca se necesita. –
Realmente no se puede obligar al optimizador a hacer nada, pero puede guiarlo.
UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93
Utilice la cláusula allow_page_locks de ALTER/CREATE INDEX:
ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF);
Una nota importante es que esto puede escalar a un bloqueo de tabla si se ejecuta bajo en recursos –
@Sam: Detalles;) Verdad en publicidad: ** nunca ** desactivaría esto en mi base de datos. La solución siempre es diseñar correctamente el esquema y las consultas para que los escaneos (que son los culpables de la escalada) no ocurran para empezar ... –
totalmente de acuerdo ... es muy raro que necesite este tipo de cortes y luego terminas mordiéndote de todos modos –
- 1. Seguridad de nivel de fila en SQL Server 2012
- 2. ¿Por qué el bloqueo a nivel de tabla es mejor que el bloqueo a nivel de fila para tablas grandes?
- 3. Comprender el comportamiento de bloqueo en SQL Server
- 4. SQL extensión de bloqueo de SQL Server tema extensión de bloqueo del servidor
- 5. Desplazamiento de fila en SQL Server
- 6. restricción de fila única en SQL Server
- 7. bloqueo de aplicaciones web ASP.NET: creo que es causado por el bloqueo de SQL Server
- 8. SQL: ¿Es posible la fila de datos "Write Protect"?
- 9. bloqueo pesimista en T-SQL
- 10. Implementación de seguridad de nivel de fila en SQL Server 2008
- 11. Problema de bloqueo de SQL Server 2005 (ASYNC_NETWORK_IO)
- 12. SQL Server CLR UDF con parámetros de salida: ¿es posible?
- 13. SQL Server Sentencias SELECT causantes de bloqueo
- 14. SQL Server 2008 nivel de compatibilidad
- 15. nivel de fila en Django
- 16. ¿Es posible establecer columna predeterminada en NewId() de SQL Server?
- 17. ¿Es posible crear un procedimiento almacenado global en el nivel de servidor Sql
- 18. Forzando un tiempo de espera de consulta en SQL Server
- 19. SQL Server Tamaño máximo de fila
- 20. ¿Es posible restaurar la copia de seguridad de Sql Server 2008 en el servidor sql 2005
- 21. Página de SQL Server 2008/Pensamientos de Compresión de fila
- 22. ¿Es posible implementar el bloqueo de ámbito en C#?
- 23. ¿Es posible forzar automáticamente el modo SQLCMD en el script?
- 24. ¿Cuál es el nivel de aislamiento de transacción predeterminado para SQL Server con ADO.NET?
- 25. Posible comprimir el tráfico de red de SQL Server?
- 26. ¿Cuál es el alcance de CONTEXT_INFO en SQL Server?
- 27. Cómo verificar el nivel de aislamiento de otra conexión SQL Server 2008
- 28. Consejos para minimizar el bloqueo en una tabla de solo agregar en MS SQL Server?
- 29. ¿Es posible crear un nuevo operador T-SQL usando el código CLR en SQL Server?
- 30. Bloqueo de nivel de clase Java vs. bloqueo de nivel de objeto
La pregunta principal sería: ¿por qué ** ** en la tierra le gustaría hacer esto en la primera ¿¿lugar?? –
Tengo dos sentencias SQL que se ejecutan en un interbloqueo, lo que no esperaba. Ver: http://stackoverflow.com/questions/3112699/how-can-i-avoid-a-deadlock-between-these-two-sql-statements – Elan
@marc_s Tenía la misma necesidad. ¿Sabes por qué? Tengo una sp que necesita ejecutarse en paralelo y donde tengo un código para que varias tablas se modifiquen por una gran cantidad de filas. No tengo idea de por qué esto no debe considerarse una necesidad válida y natural. El problema es que causa un punto muerto en SQL Server ... – Mashrur