Efetivação em Duas Fases
- 1 Preparando uma viagem
- 2 Efetivação em duas fases
- 2.1 Efetivação em duas fases (Two-Phase Commit)
- 2.2 Primeira fase: preparar hotel
- 2.3 Primeira fase: preparar passagens aéreas
- 2.4 Primeira fase: aguardar confirmações
- 2.5 Segunda fase: confirmar todas as reservas
- 2.6 Termos do protocolo Two-Phase Commit
- 2.7 Propriedade
- 2.8 Especificações
- 2.9 Separação de memória
- 2.10 Atomicidade
- 2.11 Atomicidade em modelos
- 2.12 Aplicação prática de Two-Phase Commit
- 2.13 Referências
1 Preparando uma viagem
1.1 Preparando uma viagem
Tomas está planejando uma viagem e precisa de hospedagem e passagens aéreas.

Entretando, Tomas está com medo de reservar o hotel e acabar não conseguindo passagem. Ou pior, comprar as passagens e acabar não conseguindo um hotel pra ficar.
1.2 Iniciando reserva do hotel
Tomas tem um plano! Primeiro, ele abre o site do hotel e inicia uma reserva. Esses sites normalmente seguram as reservas iniciadas por alguns minutos para você preencher seus dados de pagamento, então existe uma certa garantia de que a hospedagem será do Tomas se ele confirmar a tempo.

1.3 Iniciando reserva das passagens aéreas
Depois, ele muda de aba para o site da companhia aérea e inicia a reserva do voo.

PS: Para efeitos desse exemplo, vamos considerar que os sites de companhia aérea funcionam decentemente.
1.4 Confirmando a reserva do hotel
Agora que o Tomas sabe que tem as passagens e hospedagem que precisa, ele inicia as confirmações.

1.5 Confirmando a reserva das passagens aéreas
Em seguida, ele confirma as passagens aéreas.

1.6 Protocolo de preparação de viagem do Tomas
Assumindo que:
Os sites de hotel e passagens aéreas vão manter disponíveis os itens selecionados enquanto a reserva não expirar
- Por exemplo, se o Tomas iniciou uma reserva do último quarto de
hotel, aquele hotel vai aparecer indisponível se outra pessoa procurar
enquanto o Tomas não finaliza sua compra, ou seu tempo expira.
- Por exemplo, se o Tomas iniciou uma reserva do último quarto de
hotel, aquele hotel vai aparecer indisponível se outra pessoa procurar
enquanto o Tomas não finaliza sua compra, ou seu tempo expira.
- Os sites não vão ficar indisponíveis durante o processo
O Tomas tem tempo suficiente para confirmar as duas reservas antes de alguma delas expirarem
- Por exemplo, o Tomas não vai ficar sem internet no meio do processo.
Podemos garantir que:
- Se o Tomas reservar a passagem aérea, ele conseguirá
hospedagem.
- Se o Tomas reservar hospedagem, ele conseguirá passagem aérea.
2 Efetivação em duas fases
2.1 Efetivação em duas fases (Two-Phase Commit)
Podemos dizer que o protocolo do Tomas é uma efetivação em duas fases.
- Na primeira fase, ele prepara as reservas em ambos os sites, e
aguarda confirmação
- Na segunda fase, ele efetiva as reservas preparadas na primeira fase
2.2 Primeira fase: preparar hotel
Primeiro, o Tomas requisita uma preparação do site do hotel. Preparar aqui significa:
- "Oi, se tiver um quarto de hotel disponível pro dia tal, me avisa e guarda ele pra mim. Te confirmo e dou meus dados de pagamento daqui a pouco."
As partes importantes são:
- Me avisa se tem hotel disponível
- Deixa ele guardado pra mim

2.3 Primeira fase: preparar passagens aéreas
Novamente, as partes importantes são:
- Me avisa se tem passagem aérea disponível
- Deixa guardado pra mim

2.4 Primeira fase: aguardar confirmações
Para finalizar a primeira fase, o Tomas deve receber a confirmação de que as preparações foram positivas.
- Se alguma das reservas não funcionar, ele aborta a operação, cancelando ou fechando a aba do outro site.

2.5 Segunda fase: confirmar todas as reservas
Na segunda fase, considerando que as preparações foram positivas, basta que o Tomas confirme todas as reservas.
- Isso é a efetivação da operação (commit).
- Commit pode também ser traduzido como comprometer-se. É quando o Tomas dá os dados de cartão de crédito dele e se compromete com a compra.

2.6 Termos do protocolo Two-Phase Commit

2.7 Propriedade
Queremos garantir que:
- Se o Tomas reservar a passagem aérea, ele conseguirá
hospedagem.
- Se o Tomas reservar hospedagem, ele conseguirá passagem aérea.
Pensando que podemos ter vários outros resource managers, podemos generalizar isso como:
- Se um resource manager for efetivado, então todos os outros devem ser também
2.8 Especificações
- Vamos ver as especificações em Quint e TLA+
2.9 Separação de memória
- Nas especificações, o que cada componente do sistema conhece fica
sempre to estado da nossa máquina de estados.
Na realidade de sistemas distribuídos, é importante considerar que esse conhecimento está separado
- Só o site do hotel sabe da disponibilidade de quartos e pode fazer
reservas
- Só o site da companhia aérea sabe da disponibilidade de voos e pode
fazer reservas
- Só o site do hotel sabe da disponibilidade de quartos e pode fazer
reservas
- Se a memória fosse uma só, seria muito mais simples
2.10 Atomicidade
Operações atômicas são aquelas que podem executar sem "interrupção" de outro processo.
São aquelas que conseguimos executar de certeza, não importa o que aconteça com os outros fatores.
- "Outros fatores" depende do nosso nível de abstração e suposições
Exemplo de operações atômicas:
- Iniciar uma reserva
- Confirmar uma reserva
- Cancelar uma reserva
Exemplo de operação não atômica:
Comprar uma passagem aérea
- Considerando o nível de abstração do exemplo do Tomas, é possível
dar início e até finalizar a compra de hospedagem
enquanto ele compra passagens aéreas.
- Se algo pode acontecer enquanto a operação acontece, a operação não é atômica.
- Considerando o nível de abstração do exemplo do Tomas, é possível
dar início e até finalizar a compra de hospedagem
enquanto ele compra passagens aéreas.
2.11 Atomicidade em modelos
Uma ação vai sempre representar uma operação atômica
- Nada pode acontecer enquanto uma transição do
sistema acontece
- Depende completamente do nível de abstração que escolhemos
- Podemos entrar em mais detalhe e considerar cada clique que o Tomas dá nos sites.
PS: No trabalho 1, o nível de abstração mais apropriado é uma transição por turno.
2.12 Aplicação prática de Two-Phase Commit
Um exemplo de aplicação é para escrever dados em múltiplos bancos de dados diferentes, a fim de manter consistência de dados entre eles.
Semelhante ao exemplo em (HOWARD, 2016)
Já usei em uma migração de bancos de dados