2009-06-02 10 views
7

Cuando SQL Server Books Online dice que compartidos (S) bloquea" en un recurso se liberan tan pronto como la operación de lectura completa, a menos que el nivel de aislamiento se establece en Lectura repetible o superior, o una sugerencia de bloqueo se usa para retener los bloqueos compartidos (S) durante la transacción ".¿Cuándo se lanzan los bloqueos de lectura compartidos?

Suponiendo que estamos hablando de un bloqueo a nivel de fila, sin transacción explícita, al nivel de aislamiento predeterminado (Lectura confirmada), ¿qué significa "operación leer" se refieren a?

  • ¿Lectura de una sola fila de datos?
  • ¿La lectura de una sola página IO de 8k?
  • o hasta que la instrucción Select completa en la que se creó el bloqueo haya terminado de ejecutarse, sin importar cuántas otras filas estén involucradas ?

NOTA: La razón por la que necesito saber esto es que tenemos una segunda declaración de selección de solo lectura generada por un servicio web de capa de datos, que crea bloqueos de lectura compartida a nivel de página, generando un interbloqueo debido a conflictos con la actualización exclusiva de nivel de fila bloquea desde un proceso de replicación que mantiene actualizado el servidor. La instrucción select es bastante grande, con muchas sub-selecciones, y un DBA propone que la reescribamos para dividirla en múltiples instrucciones más pequeñas (piezas de ejecución más cortas), "para reducir el tiempo que se mantienen los bloqueos". Como esto supone que los bloqueos de lectura compartidos se mantienen hasta que finaliza la instrucción de selección completa, si eso es incorrecto (si se liberan bloqueos cuando se lee la fila o la página), entonces ese enfoque no tendría ningún efecto ...

+0

Esta es una pregunta bastante técnica sobre SQL Server Storage Engine. Esta publicación puede ser mejor servida en ServerFault.com ya que sé que hay algunos administradores de SQL Server muy atentos allí. –

Respuesta

3

Es bastante interesante de ver en realidad, es posible que desee iniciar el generador de perfiles y rastrear la adquisición/liberación de bloqueo de algunas consultas simples. Lo hice hace un tiempo atrás, fue algo así como: página de adquirir 1 fila adquirir 1 fila adquirir 2 fila de liberación 1 fila adquirir 3 fila de liberación 2 página de compra del 2 liberación página 1 ...

Puede que no sea 100% correcto, pero ese fue básicamente el enfoque. Entonces, el bloqueo se libera después de que se lee la fila, o tal vez más correctamente después de que se adquiere el siguiente bloqueo de filas. Sospecho que esto puede tener que ver con mantener un estado constante para el cruce.

+0

Gracias, por casualidad, ¿tiene alguna referencia en la que se documente este comportamiento? –

+0

aunque la salida de perfilador que describes suena bastante definitiva ... –

+0

@Charles, no he encontrado ninguna documentación que describa esto. Pero como dices, la salida del generador de perfiles es bastante concluyente :) Te recomiendo que realices ese ejercicio si tienes curiosidad. – ahains

1

No creo que esté adquiriendo dos bloqueos de nivel de página al mismo tiempo. Creo que solo aparece en Profiler de esa forma porque los eventos ocurren tan rápido. si se produce, como se sospecha, siempre habría dos bloqueos a nivel de página, pero cuando se ejecuta una consulta grande con bloqueo compartido, a veces veo dos bloqueos a nivel de página y, a veces uno a través de esta consulta:

SELECT * 
FROM sys.dm_tran_locks 
WHERE request_session_id = <SPID> 

lo tanto, lo Creo que está sucediendo es:

  1. adquirir: db bloqueo compartido, mesa compartida de bloqueo, bloqueo de página compartida
  2. página se lee ... Cierre de liberación simultánea de la página y adquirir bloqueo en la página siguiente

El resultado de dos es que a veces en la consulta sys.dm_tran_lock.Veo dos bloqueos de PAGE y, a veces, una y varias veces tres ... depende de lo que ocurra más rápido durante las acciones simultáneas.

Cuestiones relacionadas