PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Używanie dwufazowych zatwierdzeń na postgres

Myślę, że źle zrozumiałeś PREPARE TRANSACTION .

To oświadczenie kończy pracę nad transakcją, to znaczy powinno zostać wydane po cała praca jest wykonana. Chodzi o to, aby PREPARE TRANSACTION robi wszystko, co potencjalnie mogłoby się nie powieść podczas zatwierdzenia, z wyjątkiem samego zatwierdzenia. Ma to zagwarantować, że kolejne COMMIT PREPARED nie może zawieść.

Chodzi o to, że przetwarzanie wygląda następująco:

  • Uruchom START TRANSACTION na wszystkich bazach danych biorących udział w transakcji rozproszonej.

  • Wykonaj całą pracę. Jeśli występują błędy, ROLLBACK wszystkie transakcje.

  • Uruchom PREPARE TRANSACTION we wszystkich bazach danych. Jeśli to się nie powiedzie, uruchom ROLLBACK PREPARED na tych bazach danych, w których transakcja została już przygotowana i ROLLBACK na innych.

  • Raz PREPARE TRANSACTION powiodło się wszędzie, uruchom COMMIT PREPARED we wszystkich zaangażowanych bazach danych.

W ten sposób możesz zagwarantować „wszystko albo nic” w kilku bazach danych.

Jednym z ważnych elementów, o których nie wspomniałem, jest rozproszony menedżer transakcji . Jest to oprogramowanie, które trwale zapamiętuje, gdzie w powyższym algorytmie aktualnie odbywa się przetwarzanie, dzięki czemu może wyczyścić lub kontynuować zatwierdzanie po awarii.

Bez rozproszonego menedżera transakcji zatwierdzanie dwufazowe nie jest wiele warte i jest w rzeczywistości niebezpieczne:jeśli transakcje utkną w fazie „przygotowania”, ale nie zostały jeszcze zatwierdzone, będą nadal utrzymywać blokady i (w przypadku PostgreSQL) blokuje pracę automatycznego odkurzania nawet po ponownym uruchomieniu serwera , ponieważ takie transakcje muszą być trwałe.

Trudno to zrobić dobrze.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uzyskiwanie wpisanych wyników z surowego SQL ActiveRecord

  2. Zwracanie wartości z MyBatis <wstaw> zmapowanych metod

  3. Jak zaktualizować tabelę, gdy widok jest aktualizowany?

  4. Zapytanie rekurencyjne z sumą w Postgresie

  5. Próbuję skonfigurować postgres dla aplikacji ror, pojawia się błąd - fe_sendauth:nie podano hasła