6

Załóżmy, że wszystkie bazy danych zaangażowane w transakcję rozproszoną zaimplementowaną z dwufazowym sygnałem zatwierdzenia są gotowe do zatwierdzenia i mają niezbędne blokady. Koordynator sygnalizuje, aby zatwierdzić, a wszystkie bazy danych wykonują swoją część transakcji, ale jedna baza danych SQL napotyka błąd dzielenia przez zero w wyniku niedopatrzenia programistycznego, który nie bierze pod uwagę tej możliwości. Skoro koordynator już sygnalizował wszystkim, co dzieje się w wyniku tego dzielenia przez zero?Czy dwufazowy Commit Protect chroni przed końcowymi awariami Commit?

+0

Jak i kiedy dokładnie można się spodziewać tego błędu? Zakładam, że taki błąd wystąpiłby podczas pierwszej fazy, powodując wycofanie. – Oded

+0

Czy masz na myśli to, że definicja fazy wstępnej jest taka, że ​​wszyscy faktycznie w pełni wykonują swoją część transakcji, a ta faza zatwierdzenia jest definiowana przez zapisanie w dzienniku "", ale najważniejsze jest to, że nie następuje faktyczne wykonanie transakcji podczas fazy zatwierdzania? Wszystkie artykuły dotyczące zatwierdzania dwufazowego, które napotkałem, nigdy dokładnie nie określają, kiedy każda baza danych wykonuje swoją część transakcji. – user782220

+1

Cóż, to, co się wydarza, jest specyficzne dla implementacji. Ale tak, to właśnie by się stało (zmiany są dokonywane i jedyną rzeczą, na którą czekają rozproszone bazy danych, jest potwierdzenie od koordynatora, aby "zamknąć umowę" poprzez zatwierdzenie). – Oded

Odpowiedz

4

Druga faza zatwierdzenia zwykle nie zawiera kodu użytkownika, który może się nie powieść. Uczestniczący menedżerowie zasobów muszą zagwarantować, że żadna awaria nie może wystąpić. Jeśli ta gwarancja zostanie naruszona, protokół nie zapewni żadnych gwarancji.

Zatwierdzenie dwufazowe próbuje rozwiązać Two Generals Problem. Nie ma pełnego rozwiązania tego problemu. TPC jest przybliżeniem.

Innym sposobem, w jaki TPC może zawieść, jest partycja sieciowa. Niektóre menedżery zasobów mogą wykonać ostateczne zatwierdzenie, ale niektóre mogą nie otrzymać tej wiadomości. Ponownie, ten problem jest nierozwiązywalny. Nawet próby powtórki nie mogą go rozwiązać.

Można nawet wywołać ten problem w warunkach rzeczywistych: Uruchom wszystkie uczestniczące węzły w teście obciążeniowym i pociągnij kabel sieciowy w dowolnym punkcie. Z dużym prawdopodobieństwem twoje rozproszone bazy danych są teraz niespójne, ponieważ niektóre komunikaty o zatwierdzeniu zostały utracone w bardzo niewygodnym czasie.