DBMS - Controllo della concorrenza

In un ambiente multiprogrammazione in cui è possibile eseguire più transazioni contemporaneamente, è estremamente importante controllare la concorrenza delle transazioni. Disponiamo di protocolli di controllo della concorrenza per garantire atomicità, isolamento e serializzabilità delle transazioni simultanee. I protocolli di controllo della concorrenza possono essere ampiamente suddivisi in due categorie:

  • Protocolli basati su blocco
  • Protocolli basati su timestamp

Protocolli basati su blocco

I sistemi di database dotati di protocolli basati sul blocco utilizzano un meccanismo mediante il quale qualsiasi transazione non può leggere o scrivere dati finché non acquisisce un blocco appropriato su di essa. Le serrature sono di due tipi:

  • Binary Locks- Un blocco su un elemento di dati può essere in due stati; è bloccato o sbloccato.

  • Shared/exclusive- Questo tipo di meccanismo di chiusura differenzia le serrature in base al loro utilizzo. Se un blocco viene acquisito su un elemento di dati per eseguire un'operazione di scrittura, si tratta di un blocco esclusivo. Consentire a più di una transazione di scrivere sullo stesso elemento di dati porterebbe il database a uno stato incoerente. I blocchi di lettura sono condivisi perché nessun valore dei dati viene modificato.

Sono disponibili quattro tipi di protocolli di blocco:

Protocollo di blocco semplicistico

Semplici protocolli basati sul blocco consentono alle transazioni di ottenere un blocco su ogni oggetto prima che venga eseguita un'operazione di "scrittura". Le transazioni possono sbloccare l'elemento dati dopo aver completato l'operazione di "scrittura".

Pre-rivendicazione del protocollo di blocco

I protocolli di pre-rivendicazione valutano le loro operazioni e creano un elenco di elementi di dati su cui devono essere bloccati. Prima di iniziare un'esecuzione, la transazione richiede al sistema tutti i blocchi di cui ha bisogno in anticipo. Se tutti i blocchi vengono concessi, la transazione viene eseguita e rilascia tutti i blocchi al termine di tutte le sue operazioni. Se non vengono concessi tutti i blocchi, la transazione viene ripristinata e attende che vengano concessi tutti i blocchi.

Bloccaggio bifase 2PL

Questo protocollo di blocco divide la fase di esecuzione di una transazione in tre parti. Nella prima parte, quando la transazione inizia ad essere eseguita, cerca l'autorizzazione per i blocchi che richiede. La seconda parte è dove la transazione acquisisce tutti i blocchi. Non appena la transazione rilascia il suo primo blocco, inizia la terza fase. In questa fase la transazione non può richiedere nuovi lock; rilascia solo le serrature acquisite.

Il bloccaggio bifase ha due fasi, una è growing, dove tutti i blocchi vengono acquisiti dalla transazione; e la seconda fase si sta restringendo, in cui vengono rilasciati i blocchi detenuti dalla transazione.

Per richiedere un blocco esclusivo (in scrittura), una transazione deve prima acquisire un blocco condiviso (in lettura) e quindi aggiornarlo a un blocco esclusivo.

Rigoroso bloccaggio a due fasi

La prima fase di Strict-2PL è la stessa di 2PL. Dopo aver acquisito tutti i blocchi nella prima fase, la transazione continua a essere eseguita normalmente. Ma a differenza di 2PL, Strict-2PL non rilascia un blocco dopo averlo utilizzato. Strict-2PL mantiene tutti i blocchi fino al punto di commit e rilascia tutti i blocchi alla volta.

Strict-2PL non prevede l'interruzione a cascata come fa 2PL.

Protocolli basati su timestamp

Il protocollo di concorrenza più comunemente utilizzato è il protocollo basato sul timestamp. Questo protocollo utilizza l'ora di sistema o il contatore logico come timestamp.

I protocolli basati sul blocco gestiscono l'ordine tra le coppie in conflitto tra le transazioni al momento dell'esecuzione, mentre i protocolli basati sul timestamp iniziano a funzionare non appena viene creata una transazione.

A ogni transazione è associato un timestamp e l'ordine è determinato dall'età della transazione. Una transazione creata all'ora 0002 sarebbe più vecchia di tutte le altre transazioni successive. Ad esempio, qualsiasi transazione "y" che entra nel sistema a 0004 è più giovane di due secondi e la priorità sarà data a quella più vecchia.

Inoltre, a ogni elemento di dati viene assegnato il timestamp di lettura e scrittura più recente. Ciò consente al sistema di sapere quando l'ultima operazione di "lettura e scrittura" è stata eseguita sull'elemento di dati.

Timestamp Ordering Protocol

Il protocollo di ordinamento del timestamp garantisce la serializzabilità tra le transazioni nelle operazioni di lettura e scrittura in conflitto. Questa è la responsabilità del sistema di protocollo che la coppia di attività in conflitto deve essere eseguita in base ai valori di timestamp delle transazioni.

  • Il timestamp della transazione Ti è indicato come TS ( Ti ).
  • Il timestamp di lettura dell'elemento dati X è indicato da R-timestamp (X).
  • Scrivere il timestamp dell'elemento dati X è indicato da W-timestamp (X).

Il protocollo di ordinazione del timestamp funziona come segue:

  • If a transaction Ti issues a read(X) operation −

    • Se TS (Ti) <W-timestamp (X)
      • Operazione rifiutata.
    • Se TS (Ti)> = W-timestamp (X)
      • Operazione eseguita.
    • Tutti i timestamp degli elementi dati aggiornati.
  • If a transaction Ti issues a write(X) operation −

    • Se TS (Ti) <R-timestamp (X)
      • Operazione rifiutata.
    • Se TS (Ti) <W-timestamp (X)
      • Operazione rifiutata e Ti annullato.
    • Altrimenti, operazione eseguita.

Regola di scrittura di Tommaso

Questa regola afferma se TS (Ti) <W-timestamp (X), allora l'operazione è respinta e T i è annullate.

Le regole di ordinamento del timestamp possono essere modificate per rendere serializzabile la visualizzazione della pianificazione.

Invece di fare T i rollback, l'operazione di 'scrittura' stessa viene ignorata.