¿Cómo determina SQL Server el orden en que se bloquea mientras selecciona una tabla?

10

Tengo dos procedimientos almacenados que están bloqueados cuando el sistema está bajo carga. El proceso A está seleccionando de una tabla mientras el proceso B se está insertando en la misma tabla. El gráfico de bloqueo muestra que el proceso A tiene un bloqueo de página en modo S para el que el proceso B quiere un bloqueo de modo IX, sin embargo, el proceso A está esperando un bloqueo de página en modo S para una página diferente en la que el proceso B ya tiene un bloqueo de página en modo IX .

Claramente, esto podría resolverse asegurándose de que ambas consultas bloqueen las páginas de la tabla en el mismo orden, pero no puedo entender cómo hacerlo.

Mi pregunta es: ¿cómo determina SQL Server en qué orden bloquear las páginas al hacer INSERT y SELECT y cómo puede modificar este comportamiento?

Martin Brown
fuente

Respuestas:

2

¿Cómo determina SQL Server en qué orden bloquear las páginas al hacer INSERT y SELECT?

Indeterminado: se realiza mediante procesamiento interno y depende de la salida del optimizador de consultas.

y como puedes modificar este comportamiento?

Controla tu aislamiento. Si lees para escribir, dile a SQL Server que obtenga inmediatamente un bloqueo de escritura. Punto cerrado

TomTom
fuente
1

Actualmente, el proceso A tiene un bloqueo compartido.

"Ninguna otra transacción puede modificar los datos mientras existan bloqueos compartidos (S) en el recurso". http://msdn.microsoft.com/en-us/library/aa213039%28v=sql.80%29.aspx

Si está en SQL 2005 o superior, intente usar el aislamiento de instantáneas.

"El nivel de aislamiento de la instantánea utiliza el control de versiones de fila para proporcionar consistencia de lectura a nivel de transacción. Las operaciones de lectura no adquieren bloqueos de página o fila; solo se adquieren bloqueos de tabla SCH-S. Al leer filas modificadas por otra transacción, recuperan la versión de la fila que existía cuando comenzó la transacción. Solo puede usar el aislamiento de instantáneas en una base de datos cuando la opción de base de datos ALLOW_SNAPSHOT_ISOLATION está activada. De forma predeterminada, esta opción está desactivada para las bases de datos de usuario ". http://msdn.microsoft.com/en-us/library/ms189122.aspx

Como solo se adquieren bloqueos Sch-S, su 'lectura no debería poder bloquear su escritura'.

"Los bloqueos de estabilidad de esquema (Sch-S) no bloquean ningún bloqueo transaccional, incluidos los bloqueos exclusivos (X)". http://msdn.microsoft.com/en-us/library/ms189122.aspx

Tenga en cuenta que el Nivel de aislamiento de instantáneas hace un uso intensivo de tempdb para el control de versiones de filas, por lo que debe dimensionarlo adecuadamente y atenerse a las mejores prácticas para las estrategias de disco tempdb.

brian
fuente