2012-06-26 16 views
16

Capisco che il commit a tre fasi è stato fatto per risolvere il problema del "commit a due fasi" quando nella seconda fase il coordinatore e la coorte falliscono nello stesso tempo è impossibile sapere se il coordinatore aveva deciso un messaggio di commit.commit trifase

Apparentemente il commit a tre fasi ha lo scopo di risolvere questo problema aggiungendo una fase aggiuntiva. Ma non affrontare lo stesso identico problema durante la terza fase, se il coordinatore e una coorte falliscono?

+0

Ai posteri, ecco come Wikipedia definisce 3 phase commit: http://en.wikipedia.org/wiki/Three-phase_commit_protocol – Gray

+0

Questo è il senso di questo articolo: La Il protocollo di commit a tre fasi elimina questo problema introducendo lo stato Pronto per il commit. Se il coordinatore fallisce prima di inviare messaggi pre -ommit, la coorte concorderà all'unanimità che l'operazione è stata interrotta. Il coordinatore non invierà un messaggio doCommit finché tutti i membri della coorte non avranno ACKed che sono pronti per il commit. Ciò elimina la possibilità che qualsiasi membro di coorte abbia effettivamente completato la transazione prima che tutti i membri della coorte fossero a conoscenza della decisione di farlo – Ken

+0

Semplicemente non vedo come aggiungere la fase aggiuntiva aiuterà con il problema – Ken

risposta

10

In 3PC è possibile capire la decisione fallita del coordinatore interrogando le coorti attive rimanenti. Se una coorte attiva è in stato di pre-commit, significa che tutti hanno accettato di impegnarsi (altrimenti il ​​coordinatore non avrebbe inviato il pre-commit). E abbiamo bisogno di impegnare il resto delle coorti perché quelle fallite potrebbero aver commesso.

Se nessuna delle coorti è in stato di pre-commit, possiamo supporre che il coordinatore non abbia inviato "commit" a nessuna coorte, quindi non si sono verificati effetti collaterali e possiamo abortire.

Ecco buona spiegazione: http://the-paper-trail.org/blog/consensus-protocols-three-phase-commit/

+0

"Se una coorte attiva è in pre -commit state - significa che tutti hanno accettato di impegnarsi (altrimenti il ​​coordinatore non avrebbe inviato il pre-commit) e abbiamo bisogno di impegnare il resto delle coorti perché quelle fallite potrebbero essere state commesse. " Ma cosa succede se il coordinatore non ha mai ricevuto un sì dalla coorte fallita (dopo che il coordinatore ha inviato il pre-commit, a causa di un ritardo) e ha inviato una interruzione, che la coorte fallita ha ricevuto, interrotto la transazione e poi fallito? – user1715122