Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Gestisci la concorrenza delle transazioni utilizzando i blocchi in SQL Server

In un ambiente multiutente, è essenziale mantenere la concorrenza di troncamento. Questi blocchi sono strutture in memoria di 96 byte di dimensione. Il loro ruolo è mantenere l'integrità dei dati, la coerenza e il controllo della concorrenza per ogni transazione. SQL Server segue il test ACID per ogni transazione.

  • A tomicity:questa proprietà garantisce che una transazione che coinvolge due o più processi venga impegnata completamente o che nessuno dei processi venga eseguito.
  • C onsisency:ti dà una garanzia sullo stato della transazione impegnata. Una transazione dovrebbe creare un nuovo stato di dati o tornare allo stato esistente (prima della transazione).
  • Io Solation:indica che le transazioni sono isolate l'una dall'altra. Se una transazione è in esecuzione e non ha eseguito il commit dei dati, viene isolata dalle altre transazioni.
  • D urabilità:la durabilità garantisce che i dati impegnati non vadano mai persi. Previene guasti all'alimentazione e al sistema operativo o altri errori indotti dal software.

Per garantire le proprietà ACID, SQL Server impone diversi tipi di blocchi agli oggetti. In questo caso, le altre transazioni devono attendere fino al rilascio del blocco.

Modalità di blocco

SQL Server utilizza le seguenti modalità di blocco per ogni transazione.

  • Blocchi condivisi:
    • In questo blocco, SQL Server consente ad altre sessioni di eseguire le operazioni selezionate per la lettura dei dati. Tuttavia, impedisce gli aggiornamenti finché il blocco non è attivo.
    • Più transazioni possono imporre un blocco condiviso contemporaneamente su una riga o pagina.
    • È un blocco comune che vedi sugli oggetti del tuo database.

Nel seguente T-SQL, recuperiamo il record del cliente per un ID cliente specifico. Inoltre, utilizziamo la vista a gestione dinamica sys.dm_tran_locks per controllare i blocchi esistenti.

BEGIN TRAN
SELECT * FROM [SalesLT].[Customer] WITH (HOLDLOCK)
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK

Come mostrato di seguito, ha un blocco condiviso sull'ID risorsa specificato (8194443284a0):

  • Blocchi esclusivi (X):
    • SQL Server utilizza il blocco esclusivo (X) per le operazioni DML (Elimina, Inserisci o Aggiorna), che richiedono la modifica dei dati di una riga o di una pagina.
    • Impedisce ad altri usi di accedere alla risorsa fino a quando non viene posizionato un blocco.
    • SQL Server può avere un solo blocco esclusivo su una pagina o riga per una transazione.

In questo esempio, vogliamo aggiornare i record per l'ID cliente 1. Pertanto, SQL Server richiede un blocco esclusivo sulla risorsa. Nessun'altra transazione può acquisire il blocco esclusivo su questa risorsa fino al completamento della transazione.

BEGIN TRAN
UPDATE [SalesLT].[Customer] 
SET Suffix='Mr.'  
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK
  • Aggiorna (U) blocchi:
    • Il blocco dell'aggiornamento è simile a un blocco esclusivo. Può essere posizionato su un record con un blocco condiviso.
    • Il blocco di aggiornamento inserisce un altro blocco condiviso su una riga specifica. Dopo aver modificato i record, SQL Server converte il blocco dell'aggiornamento in un blocco esclusivo.
    • SQL Server non può inserire un blocco condiviso su una risorsa con un blocco di aggiornamento.
    • Puoi anche usare WITH UPDLOCK per forzare un blocco degli aggiornamenti.

L'esempio seguente mostra un blocco di aggiornamento sull'ID risorsa (8194443284a0):

BEGIN TRAN
SELECT * FROM [SalesLT].[Customer] WITH (UPDLOCK)
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK
  • Blocchi intento:
    • Il suo scopo è informare una transazione della sua intenzione di acquisire un lucchetto. Si verifica quando una transazione richiede un blocco condiviso o esclusivo sulle risorse inferiori nella gerarchia.
    • La transazione non consente ad altre transazioni di ottenere un blocco esclusivo sul tavolo utilizzando un blocco di intenti.
    • Di seguito sono riportati i tipi di blocco degli intenti.
      • Blocco Intent Shared (IS):indica l'intenzione di SQL Server di leggere le risorse della gerarchia inferiore acquisendo il blocco condiviso individualmente su quelle risorse della gerarchia inferiore.
      • Blocco Intent Exclusive (IX):indica l'intenzione di SQL Server di modificare le risorse della gerarchia inferiore ottenendo un blocco esclusivo su quelle risorse della gerarchia inferiore.
      • Un blocco di aggiornamento intento (IU):può essere acquisito a livello di pagina solo per risorse gerarchiche inferiori e, una volta completato l'aggiornamento, viene convertito in blocco IX.

Come mostrato di seguito, la transazione ha un blocco esclusivo su una chiave e ha un blocco esclusivo Intento a livello di pagina.

Blocchi conversione

SQL Server converte i tipi di blocco per supportare più query in una transazione. Questi blocchi sono noti come blocchi di conversione.

  • SIX – Blocco condiviso con intento esclusivo:la transazione SQL Server mantiene un blocco condiviso su più pagine e ha un'esclusiva blocca su più righe.
  • SIU:la transazione SQL Server mantiene un blocco condiviso su più pagine e dispone di un Aggiorna blocca su più righe.
  • Aggiornamento UIX con blocco esclusivo dell'intento:la transazione SQL Server mantiene un blocco dell'aggiornamento su più pagine e ha un blocco Esclusivo blocca su più righe.

Blocchi schema

SQL Server acquisisce due tipi di blocchi dello schema.

  • Blocco di stabilità dello schema (Sch-S):questo blocco viene utilizzato quando viene compilata una query dipendente dallo schema e viene generato il relativo piano di esecuzione. Il blocco Sch-S non blocca alcun accesso ai dati dell'oggetto.
  • Blocco modifica schema (Sch-M):questo blocco risulta dall'esecuzione di una query DDL (Data Definition Language). SQL Server può avere un solo blocco di modifica dello schema su un oggetto. Non puoi modificare un oggetto con questo blocco schema.

Nell'esempio seguente, otteniamo entrambi i blocchi Sch-S e Sch-M durante la modifica di una definizione di oggetto.

BEGIN TRAN
Alter TABLE DemoTable ADD new bit
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'
ROLLBACK

Blocca compatibilità

La compatibilità dei blocchi è utile per verificare i blocchi consentiti in caso di più transazioni nella stessa risorsa contemporaneamente. Se una transazione inserisce un blocco, il nuovo blocco inserito da un'altra transazione dovrebbe essere compatibile con esso. Pertanto, puoi consultare il seguente elenco di compatibilità dei blocchi e trovare i blocchi supportati durante più transazioni.

Blocca le escalation

SQL ServerSQL Server ha introdotto una funzionalità di escalation dei blocchi per evitare un blocco eccessivo che potrebbe causare la pressione della memoria. SQL ServerSQL Server considera il numero di blocchi mantenuti in una determinata scansione e il numero di blocchi mantenuti dall'intera transazione e dalla memoria in modo dinamico. SQL Server converte i blocchi di basso livello in blocchi di alto livello nell'escalation dei blocchi. Ad esempio, converte i blocchi di riga in blocchi a livello di pagina.

Utilizza la seguente soglia per le escalation dei blocchi.

  • Soglia di memoria: La soglia della memoria di blocco è impostata al 40 percento della memoria di blocco.
  • Soglia di blocco: Se il numero di blocchi acquisiti nella tabella o nell'indice corrente è maggiore di 5000, è possibile attivare le escalation dei blocchi.

Gli utenti possono controllare le escalation dei blocchi utilizzando l'istruzione alter table. Puoi disabilitare completamente l'escalation del blocco per quella tabella utilizzando un valore di parametro DISABLE.

ALTER TABLE Table_name SET (LOCK_ESCALATION = < TABLE | AUTO | DISABLE > –One of those options) GO

Puoi fare riferimento alla documentazione Microsoft per comprendere in dettaglio le escalation dei blocchi.

Nota:non dovresti disabilitare l'escalation dei blocchi finché non viene testata a fondo in un ambiente inferiore e se ne consiglia l'utilizzo solo a DBA esperti.

Conclusione

Questo articolo offre una panoramica dettagliata dei blocchi di SQL Server e DMV per monitorare il blocco e il relativo processo di escalation. Il blocco è un comportamento abbastanza normale in SQL Server e dovresti conoscerlo per capire come funzionano più transazioni, simulando e fornendo dati coerenti.