Blocco condiviso emesso su IsolationLevel.ReadUncommitted


10

Ho letto che se uso IsolationLevel.ReadUncommitted, la query non dovrebbe emettere alcun blocco. Tuttavia, quando ho provato questo, ho visto il seguente blocco:

Tipo risorsa: HOBT
Request_Mode: S (condiviso)

Che cos'è un blocco HOBT? Qualcosa correlato a HBT (Heap o Binary Tree lock)?

Perché dovrei ancora ottenere un lucchetto a S?

Come evitare il blocco condiviso durante le query senza attivare l'opzione di snapshot a livello di isolamento?

Sto testando questo su SQL Server 2008 e l'opzione di snapshot è disattivata. La query esegue solo una selezione.

Vedo che Sch-S è richiesto, sebbene SQL Server non lo mostri nella mia query di blocco. Come mai emette ancora un blocco condiviso? Secondo:

IMPOSTA LIVELLO ISOLAMENTO TRANSAZIONE (Transact-SQL)

Le transazioni in esecuzione a READ UNCOMMITTEDlivello non emettono blocchi condivisi per impedire ad altre transazioni di modificare i dati letti dalla transazione corrente.

Quindi sono un po 'confuso.

Risposte:


13

Che cos'è il blocco HOBT?

Un blocco che protegge un albero B (indice) o le pagine di dati heap in una tabella che non ha un indice cluster.

Perché dovrei ancora ottenere un lucchetto a S?

Questo succede a heap. Esempio

SET NOCOUNT ON;

DECLARE @Query nvarchar(max) = 
   N'DECLARE @C INT; 
     SELECT @C = COUNT(*) FROM master.dbo.MSreplication_options';

/*Run once so compilation out of the way*/
EXEC(@Query);

DBCC TRACEON(-1,3604,1200) WITH NO_INFOMSGS;

PRINT 'READ UNCOMMITTED';
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
EXEC(@Query);

PRINT 'READ COMMITTED';
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
EXEC(@Query);

DBCC TRACEOFF(-1,3604,1200) WITH NO_INFOMSGS;

Produzione READ UNCOMMITTED

Process 56 acquiring Sch-S lock on OBJECT: 1:1163151189:0  (class bit0 ref1) result: OK

Process 56 acquiring S lock on HOBT: 1:72057594038910976 [BULK_OPERATION] (class bit0 ref1) result: OK

Process 56 releasing lock on OBJECT: 1:1163151189:0 

Produzione READ COMMITTED

Process 56 acquiring IS lock on OBJECT: 1:1163151189:0  (class bit0 ref1) result: OK

Process 56 acquiring IS lock on PAGE: 1:1:169 (class bit0 ref1) result: OK

Process 56 releasing lock on PAGE: 1:1:169

Process 56 releasing lock on OBJECT: 1:1163151189:0 

Secondo questo articolo che fa riferimento a Paul Randal, il motivo per cui è stato adottato questo BULK_OPERATIONblocco HOBT condiviso è impedire la lettura di pagine non formattate.


5

Il livello di isolamento ReadUncommitted acquisisce i blocchi. I blocchi di stabilità dello schema impediscono che gli oggetti sottoposti a query vengano modificati durante l'esecuzione della query. Questi blocchi vengono acquisiti sotto tutti i livelli di isolamento, inclusi snapshot e read_committed_snapshot (RCSI). Dalle modalità di blocco :

Schema Locks

Motore di database utilizza i blocchi di modifica dello schema (Sch-M) durante un'operazione DDL (Table Data Definition Language), ad esempio l'aggiunta di una colonna o l'eliminazione di una tabella. Durante il tempo in cui viene tenuto, il blocco Sch-M impedisce l'accesso simultaneo alla tabella. Ciò significa che il blocco Sch-M blocca tutte le operazioni esterne fino al rilascio del blocco.

Alcune operazioni del linguaggio di manipolazione dei dati (DML), come il troncamento delle tabelle, utilizzano i blocchi Sch-M per impedire l'accesso alle tabelle interessate da operazioni simultanee.

Motore di database utilizza blocchi di stabilità dello schema (Sch-S) durante la compilazione e l'esecuzione di query. I blocchi Sch-S non bloccano alcun blocco transazionale, compresi i blocchi esclusivi (X). Pertanto, altre transazioni, incluse quelle con blocchi X su una tabella, continuano a essere eseguite durante la compilazione di una query. Tuttavia, le operazioni DDL simultanee e le operazioni DML simultanee che acquisiscono blocchi Sch-M non possono essere eseguite sulla tabella.

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.