Mam aplikację - bardziej przypominającą narzędzie - która znajduje się w kącie i okresowo aktualizuje dwie różne bazy danych.Jaki jest najlepszy sposób wykonywania transakcji rozproszonych w wielu bazach danych przy użyciu Spring i Hibernate
Jest to niewielka samodzielna aplikacja, która została zbudowana w kontekście aplikacji wiosennej. Kontekst ma dwie skonfigurowane fabryki sesji hibernacji, z kolei za pomocą źródeł danych DBCP Commons skonfigurowanych na wiosnę.
Obecnie nie ma zarządzania transakcjami, ale chciałbym dodać kilka. Aktualizacja jednej bazy danych zależy od udanej aktualizacji drugiej.
Aplikacja nie znajduje się w kontenerze Java EE - jest bootstrapowana przez statyczną klasę launchera wywoływaną ze skryptu powłoki. Klasa launcher tworzy kontekst aplikacji, a następnie wywołuje metodę na jednym z jej komponentów.
Jaki jest "najlepszy" sposób na umieszczenie transakcji w aktualizacjach bazy danych?
Zostawię dla ciebie definicję "najlepsze", ale myślę, że powinna to być funkcja "łatwa do skonfigurowania", "łatwa do skonfigurowania", "niedroga" i "łatwa do spakowania i redystrybucji" . Oczywiście FOSS byłby dobry.
Transakcje rozproszone muszą zawierać wszystkie 4 właściwości ACID. Jaki masz problem? Opisany scenariusz nie może się zdarzyć, ponieważ menedżerowie komunikują się ze sobą i zatwierdzają tylko wtedy, gdy wszystkie uczestniczące węzły wymieniły "GO". – Falcon
@Falcon: A co się stanie, jeśli sieć zawiedzie pomiędzy PREPARE a COMMIT? A może jeden z serwerów umiera? "nie może się zdarzyć" nie może się zdarzyć w rzeczywistości. –
Nie, nie są instruowane, aby wycofać, ponieważ w tym scenariuszu niektóre węzły już zostały zatwierdzone. Co się stanie, gdy uszkodzony węzeł stanie się dostępny, koordynator transakcji każe mu ponownie zatwierdzić. Ponieważ węzeł odpowiedział pozytywnie w fazie "przygotowania", musi mieć możliwość "zatwierdzenia", nawet jeśli wróci z awarii. –