¿Qué es el bloqueo y cómo sucede?

20

Traté de encontrar información sobre el bloqueo en SQL Server, pero no pude encontrar una explicación concisa de lo que es y cómo sucede. ¿Podría por favor iluminarme?

jrara
fuente

Respuestas:

23

Analogías

A veces es útil usar analogías lejos de las computadoras.

Digamos que tienes una pelota y dos hijos. Solo un niño puede tener la pelota a la vez. Sin embargo, si uno de los niños recibe la pelota y no la suelta porque está distraído (por ejemplo, viendo la televisión), entonces el otro niño no podrá jugar con la pelota.

El otro hijo está bloqueado de ese recurso.

Si comparamos esto con la televisión, por ejemplo, varios niños pueden ver televisión en cualquier momento.

Cabellos

Si nos trasladamos al mundo de la base de datos, vemos que hay diferentes formas de usar los recursos (al igual que nuestros dos ejemplos anteriores). Podemos realizar "lecturas" o podemos realizar "escrituras".

Cuando queremos leer los datos, no hay razón para que otros no puedan leer los datos también, al igual que dos personas que miran televisión. Sin embargo, si queremos escribir los datos, debemos asegurarnos de que nadie más los esté mirando. Si lo están leyendo mientras lo escribimos, obtendrán lecturas "sucias". (Es decir, verán los datos parcialmente escritos, que no serán válidos).

Para asegurar que estas lecturas sucias nunca ocurran, tenemos dos tipos principales de bloqueos, Bloqueos de lectura y Bloqueos exclusivos.

Leer bloqueo

Puede tener varias conexiones diferentes que leen de la misma fuente de datos en cualquier momento dado. Pero para asegurarse de que nadie cambie esos datos mientras lo leen, sacan un Bloqueo de lectura.

Una vez que una conexión tiene un bloqueo de lectura en un dato, todas las demás conexiones deben esperar hasta que se libere el Bloqueo de lectura antes de poder escribir los datos. Otros pueden, sin embargo, eliminar sus propios bloqueos de lectura en ese mismo dato.

Cerradura exclusiva

Si una conexión desea actualizar / insertar / eliminar un dato, debe eliminar un bloqueo exclusivo. Esto evita que cualquier otra conexión elimine también un bloqueo de los datos (haciendo que el bloqueo sea exclusivo de esa conexión).

Cuando una conexión tiene un bloqueo exclusivo en los datos, no se pueden leer otras conexiones de los datos. Esto ayuda a evitar lecturas sucias al garantizar que nadie pueda leer los datos mientras se escriben.

Bloqueo

"Bloqueo" es simplemente un término que significa que una conexión mantiene un bloqueo en un recurso cuando otra conexión quiere leerlo o escribirle. No significa necesariamente que la conexión del propietario no la libere, solo que actualmente la mantiene.

Compare esto con el caso con un niño sosteniendo la pelota. El niño que sostiene la pelota está bloqueando a todos los demás niños para que no la sostengan.

Punto muerto

Sé que no preguntaste esto, pero es solo un paso más para llegar a puntos muertos (y está relacionado muy directamente con el bloqueo).

Los puntos muertos pueden ocurrir cuando tienes dos conexiones que tienen un bloqueo, pero quieren el recurso del otro. En este escenario, es como dos niños que cada uno tiene una pelota, pero quiere la pelota del otro.

Al igual que los niños, estas conexiones no están dispuestas a compartir en absoluto. Cada conexión necesita acceso a ambos recursos para poder continuar. Sin embargo, están en un estado de bloqueo permanente. En este estado, el padre (DBMS) tiene que entrar y elegir un perdedor para que uno de los hijos (conexiones) pueda tener acceso a ambos recursos.

Una vez que se realiza esa conexión "ganadora", libera los recursos y luego la otra conexión ("perdedora") puede intentar nuevamente acceder a ambos recursos.

Entonces, el concepto de un punto muerto es donde tienes dos recursos que se están bloqueando entre sí.


Aquí , puede leer más sobre los diferentes tipos de bloqueos que SQL Server tiene para ofrecer y los diferentes recursos que pueden causar bloqueos / puntos muertos. El artículo es antiguo, pero aún se aplica para SQL Server 2000 hasta 2008 R2. (Hay algunos tipos más de bloqueos agregados a versiones posteriores de SQL Server, pero eso le dará un punto de partida).

Ricardo
fuente
1
@ Richard, como habías mencionado si se produce un punto muerto, entonces el DBMS entraría y elegiría a un perdedor. ¿El DBMS lo hace automáticamente? ¿O se detendría un sistema mal diseñado (uno que experimenta bloqueos a menudo) hasta que una persona inicie el DBMS para hacerlo?
CenterOrbit
2
Para SQL Server, esto se hace automáticamente (siempre que la base de datos pueda detectar el punto muerto ). Podría tener problemas para detectarlo si, por ejemplo, en realidad es un bloqueo activo .
Richard
Excelente y muy minuciosa respuesta Richard. Un punto adicional sobre los bloqueos en vivo (que en realidad no debería ser comparado o relacionado con los puntos muertos, es simplemente un bloqueo antiguo) ... SQL evitará que se realicen más bloqueos donde está esperando un bloqueo exclusivo, IIRC después de 4 bloqueos compartidos superpuestos sucesivos.
Mark Storey-Smith
5

Gran explicación de Richard, pero solo quería agregar enlaces a la documentación oficial. Estos temas fueron escritos para SQL Server 2000, pero muchos de los conceptos siguen siendo los mismos hoy:

Comprender y evitar el bloqueo

Comprender el bloqueo en SQL Server

Editar - algunas adiciones:

Los 3 son autores y / o MVP muy conocidos de SQL Server.

Aaron Bertrand
fuente