# Protocollo di aggiornamento a due fasi

Nelle reti di calcolatori e nei database, il protocollo di aggiornamento a due fasi (conosciuto come 2PC - Two-phase commit protocol) è un algoritmo distribuito che comprende tutti i nodi in un sistema distribuito per convalidare una transazione.
Il protocollo deriva da tutti i nodi che convalidano la transazione o la fanno abortire, anche nel caso di errori di rete o dovuti ai nodi. Comunque sia, in base al lavoro svolto da Skeen e Stonebraker, il protocollo non gestirà più di un errore alla volta.
Le due fasi dell'algoritmo sono la fase di richiesta di validazione, nella quale il coordinatore si occupa di preparare tutti i gruppi e richiedere una convalida, e la fase di validazione, nella quale il coordinatore completa la transazione a tutti i gruppi.
Sin dagli anni '80, la tecnologia di aggiornamento a due fasi è stata usata per il controllo automatico, per monitorare le validazioni e/o il ripristino delle attività riguardanti le transazioni in un sistema di database distribuito. Questa tecnologia viene impiegata quando gli aggiornamenti dei dati necessitano di avvenire simultaneamente in database multipli all'interno di un sistema distribuito. Nei sistemi di database distribuiti gli aggiornamenti a due fasi sono pensati per garantire l'integrità e l'accuratezza dei dati attraverso blocchi sincronizzati di ogni parte di una transazione. Risulta particolarmente utile per le prenotazioni di hotel e aerei, transazioni di merci, transazioni bancarie e per le carte di credito.

## Presupposti

Il protocollo lavora nella seguente maniera: un nodo è designato come coordinatore, il quale è il sito principale, mentre il resto dei nodi della rete sono designati come gruppi. Il protocollo presuppone che ci sia un immagazzinamento stabile a ogni nodo con un write-ahead log, che nessun nodo sia sistematicamente corrotto, che il dato nel write-ahead log non sia mai perso o corrotto, e che ogni coppia di nodi possa comunicare tra di loro. L'ultimo presupposto non è molto restrittivo dato che la comunicazione di rete può tipicamente essere deviata. I primi due presupposti invece sono più forti, perché se un nodo viene totalmente distrutto i dati possono andare perduti. Il protocollo è iniziato dal Coordinatore dopo che l'ultimo punto della transazione sia stato raggiunto. I gruppi quindi rispondono con un messaggio di concordo o con un messaggio di aborto a seconda del successo.

## Fase di preparazione/richiesta

* Il coordinatore invia un messaggio di richiesta di validazione a tutti i gruppi.
* I gruppi eseguono la transazione fino al punto dove gli è stata richiesta la convalida. Ognuno di essi scrive una nota al loro undo log e una al loro redo log.
* Ogni gruppo risponde con un messaggio di concordo se la transazione ha avuto successo, o con un messaggio di aborto se la transazione è fallita.
* Il coordinatore aspetta di ricevere un messaggio da ogni singolo gruppo.

## Fase di validazione
### Successo

Se il coordinatore riceve un messaggio di concordo da tutti i gruppi durante la fase di richiesta di validazione:
* Il coordinatore invia un messaggio di validazione a tutti i gruppi.
* Ogni gruppo completa le operazioni, e rilascia tutti blocchi e le risorse applicate durante la transazione.
* Ogni gruppo invia un riscontro al coordinatore.
* Il coordinatore completa la transazione quando il riscontro è stato ricevuto.

### Fallimento

Se almeno un gruppo invia un messaggio di aborto durante la fase di richiesta di validazione:
* Il coordinatore invia un messaggio di contenimento a ogni gruppo.
* Ogni gruppo non porta a termine la transazione usando l'undo log, e rilascia le risorse e i blocchi applicati durante la transazione.
* Ogni gruppo invia un riscontro al coordinatore.
* Il coordinatore completa la transazione quando il riscontro è stato ricevuto.

## Svantaggi

Il più grande svantaggio del protocollo di aggiornamento a due fasi è quello di essere un protocollo bloccante. Un processo sarà bloccato mentre è in attesa di un messaggio. Ciò significa che gli altri processi che competono per le risorse bloccate applicate dai processi di bloccaggio, dovranno attendere fino a che i blocchi non saranno rilasciati. Il singolo nodo continuerà ad aspettare sino a che gli altri siti avranno fallito. Se il coordinatore fallisce in modo permanente, alcuni gruppi non risolveranno mai la loro transazione. Ne deriva che le risorse sono legate per sempre. L'algoritmo può essere bloccato a tempo indeterminato nel seguente modo: se un gruppo ha inviato un messaggio di concordo al coordinatore, sarà bloccato finché una convalida o un contenimento venga ricevuto. Se il coordinatore è permanentemente fuori uso, il gruppo sarà bloccato indefinitamente, a meno che non ottenga una decisione globale di convalida/aborto da qualche altro gruppo. Quando il coordinatore invia la "richiesta di convalida" ai gruppi, verrà bloccato fino a che tutti i gruppi abbiano inviato la loro decisione locale. Inoltre, se un gruppo è permanentemente fuori uso, il coordinatore non sarà bloccato a tempo indeterminato: dato che il coordinatore è l'unico che decide se la decisione è validata o abortita, il blocco permanente può essere evitato introducendo una pausa: se il coordinatore non ha ricevuto tutti i messaggi attesi quando la pausa è terminata, opterà per l'aborto. Questo comportamento conservatore da parte del protocollo comporta un altro svantaggio: è influenzato dal caso del aborto più che dal caso di completamento. Molte ricerche di database sono state fatte in modo da ricevere il massimo dei benefici dal protocollo di aggiornamento a due fasi senza costi.

## Protocollo di aggiornamento a due fasi (tree)

Una comune variante del 2PC in un sistema distribuito è il protocollo Tree 2PC. In questa variante il coordinatore è la radice di un albero di comunicazione, mentre i gruppi sono gli altri nodi. I messaggi da parte del coordinatore vengono propagati nel "sotto" l'albero, mentre i messaggi al coordinatore sono "collezionati" da un gruppo proveniente da tutti i gruppi al di sotto di esso, prima che invii il messaggio appropriato al di sopra dell'albero (ad eccezion fatta per un messaggio di aborto, che è propagato verso l'alto immediatamente dopo la sua ricezione, o se questo gruppo decide di abortire).
Il protocollo di aggiornamento dinamico a due fasi (Dynamic two-phase commitment, D2PC) è una variante del protocollo Tree 2PC senza un coordinatore predeterminato. D2PC ha un tempo ottimale (tra le istanze di una specifica transazione ad albero, e ogni specifica implementazione di protocollo Tree 2PC; tutte le istanze hanno lo stesso albero; ogni istanza ha un nodo differente come coordinatore): impegna il coordinatore ed ogni in gruppo nel minor tempo possibile, permettendo brevi rilasci delle risorse bloccate.