Che cos'è il blocco e come succede?


20

Ho provato a trovare alcune informazioni sul blocco in SQL Server, ma non sono riuscito a trovare una spiegazione concisa su cosa sia e come accada. Potresti per favore illuminarmi?

Risposte:


23

analogie

A volte aiuta a usare le analogie lontano dai computer.

Diciamo che hai una palla e due bambini. Solo un bambino può avere la palla alla volta. Tuttavia, se uno dei bambini prende la palla e non la lascia andare perché è distratto (guardando la TV, per esempio), allora l'altro bambino non potrà giocare con la palla.

L'altro figlio è bloccato da quella risorsa.

Se confrontiamo questo con la TV, ad esempio, diversi bambini possono guardare la TV in qualsiasi momento.

serrature

Se passiamo al mondo del database, vediamo che ci sono diversi modi per usare le risorse (proprio come i nostri due esempi sopra). Siamo in grado di eseguire "letture" o di "scritture".

Quando vogliamo leggere i dati, non c'è motivo per cui anche gli altri non possano leggere i dati, proprio come due persone che guardano la TV. Tuttavia, se vogliamo scrivere i dati, dobbiamo assicurarci che nessun altro li stia guardando. Se lo leggono mentre lo scriviamo, avranno letture "sporche". (Significato, vedranno i dati parzialmente scritti, il che non sarà valido.)

Al fine di garantire che queste letture sporche non si verifichino mai, abbiamo due tipi primari di blocchi: blocchi di lettura e blocchi esclusivi.

Leggi Lock

È possibile avere più connessioni diverse che leggono dalla stessa origine dati in qualsiasi momento. Ma per assicurare che nessuno cambi tali dati mentre li leggono, eliminano un blocco di lettura.

Una volta che una connessione ha un blocco di lettura su un dato, tutte le altre connessioni devono attendere fino al rilascio del blocco di lettura prima di poter scrivere i dati. Altri, tuttavia, possono eliminare i blocchi di lettura per conto proprio sullo stesso dato.

Lucchetto esclusivo

Se una connessione desidera aggiornare / inserire / eliminare un dato, devono rimuovere un blocco esclusivo. Ciò impedisce a qualsiasi altra connessione di rimuovere anche un blocco sui dati (rendendo il blocco esclusivo per quella connessione).

Quando una connessione ha un blocco esclusivo sui dati, nessuna altra connessione può leggere dai dati. Questo aiuta a prevenire letture sporche assicurando che nessuno possa leggere i dati mentre vengono scritti.

Blocco

"Blocco" è semplicemente un termine che significa che una connessione è in possesso di un blocco su una risorsa quando un'altra connessione vuole leggere o scrivere su di essa. Non significa necessariamente che la connessione del proprietario non lo rilasci, ma solo che al momento lo sta trattenendo.

Confronta questo con il caso con un bambino che tiene la palla. Il bambino che tiene la palla sta impedendo a tutti gli altri bambini di tenere la palla.

punto morto

So che non l'hai chiesto, ma è solo un altro passo per arrivare ai deadlock (ed è direttamente correlato al blocco).

I deadlock possono verificarsi quando si hanno due connessioni ognuna con un blocco, ma si vogliono risorse a vicenda. In questo scenario, è come due bambini che ognuno ha una palla, ma vuole la palla dell'altro.

Come i bambini, queste connessioni non sono affatto disposte a condividere. Ogni connessione deve avere accesso a entrambe le risorse per poter continuare. Tuttavia, sono in uno stato di blocco permanente. In questo stato, il genitore (DBMS) deve entrare e scegliere un perdente in modo che uno dei figli (connessioni) possa avere accesso a entrambe le risorse.

Una volta effettuata la connessione "vincente", rilascia le risorse e quindi l'altra connessione ("perdente") può riprovare ad accedere a entrambe le risorse.

Quindi, il concetto di deadlock è dove hai due risorse che si bloccano a vicenda.


Qui puoi leggere ulteriori informazioni su tutti i diversi tipi di blocchi che SQL Server ha da offrire e sulle diverse risorse che possono causare blocchi / deadlock. L'articolo è vecchio, ma si applica ancora per SQL Server 2000 fino al 2008 R2. (Esistono alcuni altri tipi di blocchi aggiunti alle versioni successive di SQL Server, ma ciò fornirà un punto di partenza.)


1
@Richard, come hai accennato se si verifica un deadlock, il DBMS entrerebbe e sceglierebbe un perdente .. Questo viene fatto automaticamente dal DBMS? O un sistema mal progettato (uno che sperimenta spesso deadlock) si fermerebbe fino a quando una persona non avvia il DBMS per farlo?
CenterOrbit,

2
Per SQL Server, questo viene eseguito automaticamente (a condizione che il database sia in grado di rilevare il deadlock ). Potrebbe avere problemi a rilevarlo se, ad esempio, è in realtà un blocco live .
Richard,

Risposta eccellente e molto approfondita Richard. Un ulteriore punto sui blocchi live (che non dovrebbero essere realmente confrontati o correlati ai deadlock, è solo un vecchio blocco normale) ... SQL impedirà che vengano presi ulteriori blocchi laddove un blocco esclusivo è in attesa, IIRC dopo 4 blocchi condivisi sovrapposti successivi.
Mark Storey-Smith,

5

Grande spiegazione di Richard, ma volevo solo aggiungere collegamenti alla documentazione ufficiale. Questi argomenti sono stati scritti per SQL Server 2000, ma molti dei concetti rimangono gli stessi oggi:

Capire ed evitare il blocco

Comprensione del blocco in SQL Server

Modifica - alcune aggiunte:

Tutti e 3 sono autori e / o MVP di SQL Server molto noti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.