Two-phase commit protocol

Introdução
As principais características do Two-phase commit protocol (Commit em duas fases): Dentre as desvantagens do Two-phase commit protocol estão incluídos:
 * Está de acordo com o Atomic Commitment Protocol (Protocolo de Commit Atômico);
 * Algoritmo distribuído entre processos interconectados, coordenando-os em uma transação distribuída, porém atômica;
 * Suporta falhas temporárias no sistema, como por exemplo, problemas de rede ou de comunicação, etc;
 * De qualquer forma, em alguns casos mais raros há necessidade de manutenção por parte de um administrador, já que o protocolo não tem 100% de garantia de funcionamento;
 * Para isso, faz grande uso de logs para recuperação de quedas ou problemas durante a transação;
 * Logs geralmente acarretam em queda de desempenho, porém garantem melhor tratamento dos possíveis erros ocorridos em transações;
 * O Two-phase commit protocol não deve ser confundido com o protocolo two-phase locking (2PC) que é um protocolo de controle de concorrência;
 * Protocolo de bloqueio;
 * Depedência em cima do coordenador: se este parar de funcionar, todos os nós que estiverem bloqueados aguardando mensagens podem também ser prejudicados;

Funcionamento
Dentre todos os processos envolvidos em uma transação distribuída (chamados de "nós"), são definidos os seguintes papéis:
 * Coorte: qualquer processo (com exceção do coordenador) que participa da transação;
 * Coordenador: processo que coordena a fase de votação das coortes e que decidirá se a transação será "comitada" ou abortada, comunicando a todas elas de sua decisão;

Requisitos

 * Stable Storage em cada um dos nós;
 * Além disso, é necessário garantir que há write-head log;
 * Nenhum nó cairá para sempre;
 * Garantia de que os dados gravados no write-ahead log nunca serão corrompidos em caso de queda no sistema;
 * Todos os nós se comunicam com todos os nós (não obrigatório);

As "duas fases"
Em uma execução normal e bem sucedida de qualquer transação distribuída, o protocolo compreende duas fases, commit-request phase (or voting phase) e commit phase.

Commit-request phase (Voting phase)
Dentre os processos envolvidos em uma transação, existe um processo chamado coordenador que, durante esta fase, prepara todos estes processos indicando e perguntando a eles se é possível realizar o commit ou o rollback da transação.

Nesta fase, cabe a todos os participantes responderem "Sim" ou agreement message (caso sua pequena porção da transação ter sido completada com sucesso) ou "Não" ou abort message (caso qualquer problema tenha ocorrido e que seja necessário abortar a transação).

Algoritmo

 * O coordenador envia uma pergunta (query to commit) à todos as coortes e espera a resposta de cada uma;
 * As coortes executam a transação escrevendo e escrevem em seus undo log e redo log;
 * Cada coorte responde com um agreement message (voto "Sim" para o commit) se todas as ações na transação terminarem com sucesso ou um abort message (voto "Não" para o commit) se ocorreu algum erro durante a transação;

Commit-phase (Completion phase)
Baseando-se nos votos "Sim" ou "Não" dos processos envolvidos na transação, o processo coordenador decide se ela deve ser "comitada" (somente se todos os processos votarem "Sim") ou abortada (se pelo menos um processo votar "Não") e notifica a todos os processos de sua decisão.

A partir da decisão do coordenador, cada processo realiza seu commit local ou rollback.

Algoritmo

 * Se o coordenador receber um "Sim" de todas as coortes durante a commit-request phase:
 * O coordenador envia um commit message à todas as coortes;
 * Cada coorte "comita" sua operação e libera os locks e recursos ocupados para a transação;
 * Cada coorte envia um acknowledgment ao coordenador;
 * O coordenador completa a transação após receber todos os acknowledgments;


 * Se alguma coorte votar "Não" durante a commit-request phase, ou o coordenador não receber alguma resposta por timeout:
 * O coordenador envia uma rollback message a todas as coortes;
 * Cada coorte desfaz a transação utilizando o redo log e libera os locks e recursos ocupados para a transação;
 * Cada coorte envia um acknowledgement ao coordenador;
 * O coordenador desfaz a transação após receber todos os acknowledgments;

Concursos
Two-phase commit protocol  é cobrado, na maioria das vezes, conceitualmente e basta se ter noção do funcionamento (algoritmo) das duas fases e de suas principais características. Podem ser vistas também comparações com o three-phase commit.

(Prova: CESGRANRIO - 2008 - BNDES - Profissional Básico - Especialidade - Análise de Sistemas - Suporte / Banco de Dados / Gerência de Transações) No âmbito de bancos de dados distribuídos, seja T uma transação distribuída que deve ser efetivada (commited) segundo o protocolo de compromissamento de duas fases (two-phase commit). Sobre esse assunto, assinale a afirmativa INCORRETA.

a) Para que T seja efetivada (commit), todos os nós participantes de T devem, necessariamente, concordar com a efetivação.

b) O coordenador de T pode, incondicionalmente, abortá-la.

c) Na fase 1, o coordenador de T envia uma mensagem  para todos os participantes de T, onde cada nó envia sua resposta a todos os outros nós.

d) Quando um nó participante de T e não coordenador recupera-se de uma falha e seu log apresenta um registro , o nó deve executar redo(T).

e) Quando um nó participante de T e não coordenador recupera-se de uma falha e seu log apresenta um registro , o nó deve executar undo(T).

Como visto na primeira fase do algoritmo, o coordenador envia um query to commit a todos as coortes participantes da transação, que respondem com um "Sim" (agreement) ou "Não" (abort) somente ao coordenador, e não a todos os nós. Por isso a alternativa incorreta é a letra c).

(Prova: CESGRANRIO - 2010 - EPE - Analista de Gestão Corporativa - Tecnologia da Informação / Banco de Dados / Gerência de Transações) Em determinada funcionalidade de um sistema interno de um órgão público, é necessário realizar uma transação em um banco de dados distribuído, segundo o protocolo Two-Phase Commit (2PC) ou o Three-Phase Commit (3PC), sobre os quais afirma-se que

a) ambos são bloqueantes.

b) existem dois nós coordenadores no 2PC.

c) na fase de expansão, ambos adquirem write-lock.

d) na fase de retração, o 3PC adquire write-lock.

e) somente o 2PC é bloqueante.

Sabe-se que o algoritmo two-phase commit é bloqueante; e isto já foi marcado com uma das desvantagens do mesmo. Além disso, levando em conta que o three-phase commit resolve o problema do bloqueio, considera-se a letra e) como correta.

Referências

 * http://thiagomoreira.blog.com/2010/10/12/two-phase-commit-e-a-formula-1/;
 * http://www.questoesdeconcursos.com.br/imprimir/caderno/banco-de-dados-108704;
 * http://www.questoesdeconcursos.com.br/imprimir/caderno/bd-cesgranrio-98788;
 * http://en.wikipedia.org/wiki/Two-phase_commit_protocol;
 * http://en.wikipedia.org/wiki/Three-phase_commit_protocol;