Zarządzanie transakcjami JPA

0

Ostatnio zainteresował mnie temat używania JTA w aplikacjach. Chciałbym wzbogacić swoją aplikację o architekturze: (front na angularze -> serwisy Restowe na serwerze -> logika serwera -> baza danych) o taką technologię przy komunikacji z bazą danych(JPA). Jednak zwiedzając to co mi wypluł google natrafiłem na fragmenty np. że wraz ze specyfikacją ejb3 nie mamy już ziaren encyjnych ze względu na JPA, które odpowiada za operacje związane z bazą danych. Czyli specyfikację JTA w tym przypadku zastępuje obiekt UserTransaction pobierany z EntityManagera?Czy Kontener EJB zarządza tylko transakcjami związanymi z rozproszeniem aplikacji? Czy może zarządzanie transakcjami wykorzystując JTA w przypadku baz danych "wyszło z mody" i lepiej korzystać z obiektu UserTransaction? Jak wiadomo technologie idą do przodu, a nic świeżego o JTA nie znalazłem, dlatego też mam podejrzenie, że nie korzysta się z niej w przypadku baz danych. Byłbym wdzięczny gdyby ktoś rozjaśnił mi ten temat :)

1

Jak masz aplikacje na kontenerze EJB to raczej korzystasz, tylko o tym nie wiesz. I bardzo dobrze.

Pytanie: co chcesz właściwie zrobić? (czego Ci w obecnie wykorzystanych technologiach brakuje?). Czego już używasz (konkretniej)?

1

JTA masz na każdym serwerze aplikacyjnym. Nie należy zarządzać ręcznie transakcjami, ponieważ po to masz kontener EJB. Bardzo rzadko może zdarzyć się chęć zarządzania ręcznego, jeśli potrzebujesz zasięgu transakcji mniejszego niż metoda (np. zapisujesz coś w pętli, a błąd zapisu nie ma rollbackować całej procedury zapisu) to wyjątkowa sytuacja, gdzie w EJB możesz chcieć ręcznie zarządzać transakcjami może 0.5% przypadków. Jeśli nie wiesz po co chcesz ograniczać zasięg transakcji do kontekstu EJB, to CMT (container managed transactions) są dla Ciebie: na szczęście standardy ewoluowały tak, że w zasadzie nie trzeba o tym wiedzieć, bo CMT jest domyślne.

Co zrobić, aby mieć transakcje w EJB? Wystarczy dodać @stateless i już masz obsługę JTA dla pojedynczego źródła danych JPA.

JTA działa dobrze dla systemów bez transakcji rozproszonych (1 DataSource)
JTA obsługuje transakcje rozproszone (więcej niż 1 DataSource), ale jak wiadomo im coś bardziej skomplikowane tym bardziej zawodne i w rzeczywistości niełatwo jest uzyskać super rozproszone środowisko transakcyjne (zawsze coś kosztem czegoś, opisuje to teoria CAP).
https://en.wikipedia.org/wiki/CAP_theorem

0

Dla uzupełnienia postu @margor90. W przypadku zarządzania przez kontener możesz ustawiać na metodach adnotacje dla JTA/CMT

@TransactionAttribute.

Najczęsciej w projektach spotykam @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW).
I najczęściej jest to błąd, który potem objawia się dziwacznymi zachowaniami na produkcji.

Reguła: najlepiej nic nie ustawiać, domyślne zachowanie jest dość intuicyjne, a jak już coś zamierzasz ustawić - to dokładnie doczytaj (ze zrozumieniem) jak działa JPA (i JTA) (lektura na kilka tygodni....).

0

Ok zakładając architekturę projektu o jakim pisałem chodzi o to, że mam jakieś obiekty DAO zawierające EntityManagery, z których mogę pobrać obiekty UserTransaction. Zwykle robiłem to poprzez utx.begin(); potem zmiany przez em i na konieć utx.commit();. Rozumiem, że taka ręczna obsługa nie ma nic wspólnego z JTA zapewniane przez serwer aplikacyjny(WF). Jeśli moje zdanie jest słuszne to co powinienem ustawić, aby komunikacja z bazą była oparta na transakcjach JTA i czy wtedy nie musiałbym obsługiwać obiektu UserTransaction pobieranego z em? Dodam też, że nie zamierzam obsługiwać wielu baz danych, więc jeśli źle planuje swój projekt, to też możecie mi odradzić moje rozwiązanie.

Co do lektury. Polecicie na początek tematykę EJB? Czy książka EJB 3 z helionu będzie w porządku? Niestety jeśli chodzi o dokumentacje tej technologii, czy inne dokumenty oracle nie są dla mnie tak klarowne także prosiłbym o jakieś rady z czym warto się zapoznawać. Mogą być jakieś filmiki na yt.

Dzięki za pomoc :)

0
doktorhuba napisał(a):

Ok zakładając architekturę projektu o jakim pisałem chodzi o to, że mam jakieś obiekty DAO zawierające EntityManagery

Skąd te EntityManagery masz (czyli jak są instancjonowane). Bo jak zgodnie z wszystkimi poradnikami
przez adnoitację @PersistentContext to już nic nie musisz robić. A zdecydowanie nie potrzebujesz po nic dobierać się do UserTransaction.

0

Właśnie o tym czytałem na stacku, że przy JTA muszę pobierać EntityManagera przez tą adnotację. Jednak nie znalazłem nic konkretnego nieobszernego na temat UserTansaction z EntityManagera. Dokładniejsze info na ten temat znajdę szukając źródeł dot. EJB 3.0? Głównie chodzi mi o transakcje w JPA, które obsługuje kontener serwera aplikacyjnego. Jeśli macie jakieś materiały do polecenia to możecie podrzucić( oprócz specyfikacji), byłbym wdzięczny i tak wiele mi się już wyjaśniło:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1