uni
La concorrenza è fondamentale, decine o centinaia di transazioni al secondo non possono essere seriali. Si appoggia sulla Gestione delle Transazioni.
Senza una gestione accurata la concorrenza causerebbe però anomalie: per esempio se due transazioni operano sullo stesso valore possono leggere un valore intermedio “sporco”.
Ci sono diversi tipi di anomalie:

  • perdita di aggiornamento: W-W
  • Lettura sporca: R-W o W-W con aborto
  • Lettura inconsistente: R-W
  • Aggiornamento Fantasma: R-W
  • Inserimento fantasma: R-W su dato “nuovo”

Schedule

Uno schedule è una sequenza di operazioni di lettura/ scrittura di transazioni concorrenti.
Esempio: dove rappresenta la lettura dell’oggetto da parte della transazione .
Le operazioni compaiono nello schedule nell’ordine temporale di esecuzione sul database.

Schedule seriale

Uno schedule di transazioni è detto seriale se per ogni coppia di transazioni tutte le operazioni di una delle due sono eseguite prima di qualsiasi operazione dell’altra.
Esempio:

Schedule Serializzabile

Questo è un insieme di transazioni che produce lo stesso risultato di uno schedule seriale sulle stesse transazioni. Questa definizione richiede però un concetto di equivalenza fra schedule.

View-Serializzabilità

Diciamo che esiste una relazione legge-da tra le operazioni e presenti in uno schedule se precede e se tra le due non ci sono altre . La scrittura in è detta scrittura finale su se è l’ultima su in .
Due schedule e sono detti view-equivalenti, se hanno la stessa relazione legge-da e le stesse scritture finali su ogni oggetto.
Uno schedule è view-serializzabile se è view-equivalente ad un qualche schedule seriale.
L’insieme degli schedule view-serializzabili è indicato con VSR.
La verifica della view-equivalenza di due dati schedule ha complessità polinomiale.
La verifica sulla view-serializzabilità di uno schedule è un problema NP-completo poiché è necessario confrontare lo schedule con tutti i possibili schedule seriali, questo lo rende inutilizzabile nella pratica.
Poiché l’uso della view-serializzabilità nella pratiac è impossibile definiamo una condizione di equivalenza più ristretta ma che sia utilizzabile nella pratica, quindi che abbia una complessità inferiore.

Conflict-Serializzabilità

Un’operazione è in conflitto con un’altra operazione se operano sullo stesso oggetto e almeno una di esse è una scrittura. Nota bene: nei conflitti conta l’ordine.
Il conflitto può essere:

  • R-W oppure W-R
  • W-W
    Due schedule e sono detti conflict-equivalenti, se hanno le stesse operazioni e ogni coppia di operazioni in conflitto compare nello stesso ordine in entrambi.
    Uno schedule è conflict-serializzabile se è conflict-equivalente ad un qualche schedule seriale.
    L’insieme degli schedule conflict-serializzabili è indicato con CSR.

Teorema

ogni schedule conflict-serializzabile è view-serializzabile, ma non necessariamente viceversa, quindi poiché .

Verifica della Conflict-Serializzabilità

Si fa tramite il grafo dei conflitti (Grafo):

  • Un nodo per ogni transazione
  • un arco (orientato) da a se c’è almeno un conflitto fra un’azione e un’azione tale che precede
    Teorema: Uno schedule è in CSR se e solo se il grafo è aciclico.
    Esempio:
    • S =
    • Il grafo è aciclico è CSR, quindi anche VSR
graph LR
    1((1)) --> 2((2))
    1 --> 3((3))
    1 --> 4((4))
    1 --> 5((5))
    2 --> 3
    2 --> 4
    2 --> 5
    3 --> 4
    3 --> 5
    4 --> 5

Controllo di Concorrenza

Il controllo della concorrenza è eseguito dallo scheduler, che traccia tutte le operazioni eseguite sul database dalle transazioni e decide se accettare o rifiutare le operazioni che vengono richieste, il suo obiettivo è evitare le anomalie.
Per il momento assumiamo che l’esito delle transazioni sia noto a priori (ipotesi commit-proiezione), così facendo possiamo rimuovere dallo schedule tutte le transazioni abortite, questa assunzione però non ci consente di trattare anomalie come la lettura sporca.

Media

graph TD
    A[Gestore dei metodi d'accesso] -->|read, write| B[Gestore della concorrenza]
    C[Gestore delle transazioni] -->|begin, commit, abort| B
    B --> D(Tabella dei lock)
    B --> |read,write: non tutte e in ordine ev. diverso| E[Gestore della memoria secondaria]
    E --> F[(BD)]

flowchart TB
    subgraph S1[ ]
        direction TB
        subgraph S2[ ]
            direction TB
            subgraph S3[ ]
                ScheduleSeriali(Schedule Seriali)
            end
            ScheduleCSR(Schedule CSR)
        end
        ScheduleVSR(Schedule VSR)
    end
    Schedule(Schedule)

    S1 --- Schedule
    S1 --- ScheduleVSR
    S2 --- ScheduleCSR
    S3 --- ScheduleSeriali