Condivisione della tecnologia

Blocco del database

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Sommario

1. Breve descrizione dei blocchi del database

2. Breve descrizione del Gap Lock

3. Come vengono implementati i blocchi a livello di riga in InnoDB

4. In quali circostanze si verificherà una situazione di stallo nel database?

5. Descrivere brevemente la soluzione al deadlock del database


1. Breve descrizione dei blocchi del database

I blocchi sono una caratteristica chiave che distingue i sistemi di database dai file system. Il meccanismo di blocco viene utilizzato per gestire l'accesso simultaneo alle risorse condivise. Prendiamo come esempio il motore InnoDB del database MySQL per introdurre brevemente le caratteristiche dei lock.

Se una transazione T1 ha ottenuto il lock condiviso della riga r, allora un'altra transazione T2 può ottenere immediatamente il lock condiviso della riga r, perché la lettura non modifica i dati della riga r. Questa situazione è chiamata compatibilità dei lock.Ma se un'altra transazione T3 vuole ottenere il lock esclusivo sulla riga r, deve attendere che le transazioni T1 e T2 rilascino il lock condiviso sulla riga r. Si chiama questa situazioneserratura incompatibile . La figura seguente mostra la compatibilità dei blocchi condivisi e dei blocchi esclusivi. Si può notare che X lock è incompatibile con qualsiasi blocco, mentre S lock è compatibile solo con S lock. È importante notare che sia il blocco S che il blocco X sono blocchi di riga e la compatibilità si riferisce alla compatibilità dei blocchi sullo stesso record (riga).

XS
XNon compatibileNon compatibile
SNon compatibilecompatibile

        Blocca la granularità : il motore di archiviazione InnoDB supporta il blocco multigranularità, che consente alle transazioni di avere blocchi a livello di riga e blocchi a livello di tabella contemporaneamente. Per supportare le operazioni di blocco a diverse granularità, il motore di archiviazione InnoDB supporta un metodo di blocco aggiuntivo chiamato blocco intenzionale. I blocchi di intenzione dividono gli oggetti bloccati in più livelli significano che le transazioni vogliono bloccarsi con una granularità più precisa.

Il motore di archiviazione InnoDB supporta una progettazione relativamente semplice dei blocchi di intenzione e i suoi blocchi di intenzione sono blocchi a livello di tabella. Lo scopo principale della progettazione è rivelare il tipo di blocco richiesto per la riga successiva in una transazione. Supporta due tipi di blocchi di intenzione:

1. Blocco condiviso di intenti (IS Lock), la transazione desidera ottenere blocchi condivisi per determinate righe in una tabella.

2. Blocco esclusivo dell'intento (IX Lock), la transazione vuole ottenere blocchi esclusivi su determinate righe in una tabella.

Poiché il motore di archiviazione InnoDB supporta i blocchi a livello di riga, i blocchi intenzionali non bloccheranno effettivamente alcuna richiesta tranne le scansioni complete della tabella. Pertanto la compatibilità dei blocchi di intenti a livello di tabella e dei blocchi a livello di riga è la seguente:

ÈIXSX
ÈcompatibilecompatibilecompatibileNon compatibile
IXcompatibilecompatibileNon compatibileNon compatibile
ScompatibileNon compatibilecompatibileNon compatibile
XNon compatibileNon compatibileNon compatibileNon compatibile

        algoritmo di blocco: Il motore di archiviazione InnoDB dispone di tre algoritmi di blocco delle righe, che sono:

1. Blocco record: blocca un record a riga singola.

2. Gap Lock: blocco dello spazio, blocco

3. Blocco tasto successivo: Gap Lock+Record Lock, blocca un intervallo e blocca il record stesso.

Il blocco dei record bloccherà sempre i record dell'indice Se la tabella del motore di archiviazione InnoDB non è configurata con alcun indice al momento della creazione, il motore di archiviazione InnoDB utilizzerà la chiave primaria implicita per il blocco. Next-Key Lock è un algoritmo di blocco che combina Gap Lock e Record Lock Nell'ambito dell'algoritmo Next-Key Lock, InnoDB utilizza questo algoritmo di blocco per le query di riga. La tecnologia di blocco che utilizza Next-Key Lock si chiama Next-Key Locking e il suo design non è destinato a risolvere il problema fantasma (lettura fantasma). Utilizzando questa tecnologia di blocco, ciò che viene bloccato non è un singolo valore, ma un intervallo, che rappresenta un miglioramento di Predict Lock.

        A proposito di stallo : Deadlock si riferisce a un fenomeno di due o più transazioni in attesa l'una dell'altra a causa della competizione per le risorse durante l'esecuzione. Senza la forza esterna, gli affari non saranno in grado di andare avanti.

        aggiornamento del blocco :L'escalation del blocco si riferisce alla riduzione della granularità del blocco corrente. Ad esempio, il database può aggiornare i blocchi di 1.000 righe di una tabella a un blocco di pagina oppure aggiornare un blocco di pagina a un blocco di tabella.

Il motore di archiviazione InnoDB non presenta il problema dell'aggiornamento del blocco. Poiché non genera blocchi di riga in base a ciascun record, al contrario, gestisce i blocchi in base a ciascuna pagina a cui accede ciascuna transazione, utilizzando un metodo bitmap. Pertanto, indipendentemente dal fatto che una transazione blocchi uno o più record nella pagina, il costo è in genere lo stesso.

2. Breve descrizione del Gap Lock

Il motore di archiviazione InnoDB dispone di tre algoritmi di blocco delle righe e il gap lock (Gap Lock) è uno di questi. I blocchi degli spazi vengono utilizzati per bloccare un intervallo, ma non i record stessi. Il suo scopo è impedire che più transazioni inseriscano record nello stesso intervallo, il che può portare a problemi di lettura fantasma.

3. Come vengono implementati i blocchi a livello di riga in InnoDB

Il blocco a livello di riga InnoDB viene implementato bloccando le voci di indice sull'indice. InnoDB utilizza i blocchi a livello di riga solo quando i dati vengono recuperati tramite condizioni di indice, altrimenti InnoDB utilizza i blocchi di tabella.

Quando determinate righe di una tabella sono bloccate, transazioni diverse possono utilizzare indici diversi per bloccare righe diverse. Inoltre, sia che si utilizzi l'indice della chiave primaria, l'indice univoco o l'indice ordinario, InnoDB utilizzerà i blocchi di riga per bloccare i dati.

4. In quali circostanze si verificherà una situazione di stallo nel database?

Il deadlock si riferisce a un fenomeno in cui due o più transazioni si aspettano l'una dall'altra a causa della competizione per le risorse durante l'esecuzione. Senza la forza esterna, gli affari non saranno in grado di andare avanti.La tabella seguente mostra una classica situazione di deadlock, ovvero A attende B e B attende A. Questo problema di deadlock è chiamatoSituazione di stallo AB-BA

tempoSessione ASessione B
1INIZIO:
2

mysql>SELEZIONA * DA t

DOVE a = 1 PER AGGIORNAMENTO;

************1.riga************

un:1

1 riga nel set (0,00 sec)

INIZIO:
3

mysql>SELEZIONA * DA t

DOVE a = 2 PER AGGIORNAMENTO;

************1.riga************

un:2

1 riga nel set (0,00 sec)

4

mysql>SELEZIONA * DA t

DOVE a = 2 PER AGGIORNAMENTO;

#Aspettare

5

mysql>SELEZIONA * DA t

DOVE a = 1 PER AGGIORNAMENTO;

ERRORE 1213 (40001): Deadlock trovato durante il tentativo di ottenere il blocco; provare a riavviare la transazione

5. Descrivere brevemente la soluzione al deadlock del database

Il modo più semplice per risolvere il problema dello stallo è il timeout, ovvero quando due transazioni attendono l'una dall'altra, quando un tempo di attesa supera una soglia impostata, una delle transazioni viene ripristinata e l'altra transazione in attesa può continuare.

Oltre al meccanismo di timeout, i database attuali utilizzano generalmente anche il metodo wait-for graph (wait graph) per il rilevamento dei deadlock. Si tratta di un approccio più proattivo al rilevamento dei deadlock rispetto alla soluzione di timeout. Questo approccio è adottato anche dal motore di archiviazione InnoDB. Il grafico di attesa richiede che il database memorizzi i due tipi di informazioni seguenti:

1. Blocca l'elenco delle informazioni;

2. Lista di attesa delle transazioni;

È possibile costruire un grafico tramite l'elenco collegato sopra e, se c'è un ciclo in questo grafico, significa che c'è una situazione di stallo, quindi le risorse si aspettano l'una con l'altra. Questo è un meccanismo di rilevamento dei deadlock più attivo. Quando ogni transazione richiede un blocco e attende, determinerà se è presente un loop. Se esiste, esiste un deadlock. In generale, il motore di archiviazione InnoDB sceglie di ripristinare la transazione la minima quantità di annullamento.