Utilizzo dei blocchi in Motore di database

I blocchi costituiscono un meccanismo utilizzato in Microsoft Motore di database di SQL Server per sincronizzare l'accesso allo stesso dato eseguito contemporaneamente da più utenti.

Prima che una transazione acquisisca una dipendenza sullo stato corrente del dato, ad esempio mediante un'operazione di lettura o modifica dei dati, deve proteggersi dagli effetti di un'altra transazione che esegue operazioni di modifica sugli stessi dati. A tale scopo, la transazione richiede il blocco del dato. I blocchi sono caratterizzati da diverse modalità e possono ad esempio essere condivisi o esclusivi. La modalità di blocco consente di definire il livello di dipendenza della transazione sui dati. Non è possibile concedere a una transazione un blocco che determina un conflitto con la modalità di blocco già concessa a un'altra transazione. Se una transazione richiede una modalità di blocco in conflitto con un blocco già concesso sugli stessi dati, l'istanza di Motore di database metterà in pausa la transazione richiedente fino al rilascio del primo blocco.

Quando una transazione modifica un dato, il blocco di protezione della modifica viene mantenuto fino alla fine della transazione. La durata dei blocchi acquisiti da una transazione per proteggere le operazioni di lettura dipende dall'impostazione del livello di isolamento della transazione. I blocchi acquisiti da una transazione vengono rilasciati al completamento della transazione, ovvero in corrispondenza del commit o del rollback.

I blocchi non vengono in genere richiesti direttamente dalle applicazioni, ma gestiti internamente da un componente di Motore di database denominato Gestione blocchi. Quando un'istanza di Motore di database elabora un'istruzione Transact-SQL, Query Processor di Motore di database determina le risorse cui accedere, nonché i tipi di blocchi necessari per proteggere le singole risorse in base al tipo di accesso e all'impostazione del livello di isolamento della transazione. Query Processor richiede quindi i blocchi appropriati a Gestione blocchi, che li concede a meno che non si sia verificato un conflitto con blocchi acquisiti da altre transazioni.

Nella tabella seguente vengono elencati gli argomenti in cui sono descritte le nozioni di base sull'utilizzo dei blocchi.

Argomento

Descrizione

Granularità dei blocchi e gerarchie

È possibile richiedere i blocchi per diversi tipi di risorse, ad esempio righe, pagine, indici, tabelle o database. Alcune operazioni implicano l'inserimento di blocchi a più livelli di granularità, in modo da costituire una gerarchia di blocchi.

Modalità blocco

Per i blocchi sono disponibili diverse modalità che consentono di specificare il livello di accesso concesso ad altre transazioni sulla risorsa bloccata.

Compatibilità tra blocchi (Motore di database)

Più transazioni possono acquisire blocchi simultanei sulla stessa risorsa purché le rispettive modalità di blocco siano compatibili. Una transazione che richiede una modalità di blocco in conflitto con un blocco esistente verrà messa in pausa fino al rilascio del primo blocco.

Blocco di intervalli di chiavi

Il blocco di un intervallo di chiavi consente alle transazioni eseguite al livello di isolamento Serializable di impedire inserimenti ed eliminazioni fantasma.

Escalation blocchi (Motore di database)

Se una transazione acquisisce un elevato numero di blocchi di riga o di pagina, Motore di database può concedere un blocco di tabella e rilasciare tutti i blocchi di livello inferiore riducendo al minimo l'overhead dei blocchi.

Blocco dinamico

Motore di database può scegliere in modo dinamico il livello di granularità dei blocchi in base alla stima del numero di righe cui farà riferimento un'istruzione Transact-SQL eseguita da Query Optimizer.

Visualizzazione delle informazioni sui blocchi (Motore di database)

Motore di database e le API associate includono diversi meccanismi per la visualizzazione delle informazioni sui blocchi attualmente acquisiti in un'istanza o in un database.

Utilizzo di deadlock

I deadlock si verificano quando due operazioni si bloccano reciprocamente in modo permanente perché un'operazione dispone di un blocco su una risorsa necessaria all'altra.