Transactional w warstwie serwisu czy dao

Transactional w warstwie serwisu czy dao
LU
  • Rejestracja:ponad 11 lat
  • Ostatnio:5 dni
  • Lokalizacja:Gdańsk
0
  1. Gdzie stosujecie / rekomendujecie zapinanie @Transactional? W warstwie serwisu czy "niżej" w jakimś dao?
    Drugie podejście wydaje się sensowne bo czesto dopiero na końcu coś zapisujemy / zmieniamy na bazie po wykonaniu
    "wyżej" w serwisie jakichś reguł biznesowych ewentualnie jakiś odczyt z bazy ale to nie musi być w transakcji
    plus po wywołaniu zapisu na dao mamy pewność, że był commit (jeżeli nie było wyjątku) więc możemy normalnie
    beż żadnej magii np. wysłać powiadomienie / wrzucić na kolejkę etc. Z drugiej strony jak nasz serwis zależy od
    innych, które coś zmieniają na bazie to nie ma wyboru i trzeba zastosować to pierwsze podejście.

  2. Czy używacie @Transactional(readOnly = true)? Z jednej strony niepotrzebnie wpływa na wydajność a z drugiej
    pilnuje aby metoda na pewno była tylko do odczytu plus bez niej lazy loading nie zadziała jeśli używamy hibernate.


99xmarcin
  • Rejestracja:około 5 lat
  • Ostatnio:5 miesięcy
  • Postów:2420
1
  1. Na serwisie.
  2. Często readOnly = true to no-op i ani niczego nie pilnuje, ani nic nie zmienia. Sprawdź jak się z twoim "dostawcą" JDBC zachowa...

Holy sh*t, with every month serenityos.org gets better & better...
Charles_Ray
Z tego co pamietam, readonly=true powoduje nietrackowanie encji JPA (są wczytywane poza persistence context, tj. są od razu detached).
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2
  1. Tam gdzie potrzebujesz transakcji ;) Jeśli twoje metody serwisu wykonują kilka operacji bazodanowych i chcesz zeby było "wszystko albo nic" to musisz zrobić transakcje właśnie na tym poziomie. Transakcja na jakimś DAO w ogóle nie bardzo ma sens, bo robisz tam jedną operacje.

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 4 godziny
  • Postów:1875
2

Jw. w dużej mierze jest to pytanie o ziarnistość transakcji, granice agregatów itd. Transakcje powinny być najmniejsze jak się da, ale nie mniejsze :)


”Engineering is easy. People are hard.” Bill Coughran
Zobacz pozostałe 8 komentarzy
Shalom
Możesz ale mówie o sytuacji kiedy oprócz tego warunku w tej samej transakcji masz jeszcze inne zapisy ;)
Charles_Ray
W ogólności na jedną operację biznesową składa się N odczytów i M zapisów do różnych tabel. Jeśli ta operacja ma być atomowa, to musisz wszystko objąć jedna transakcją. Dlatego warto tak projektować aplikacje, żeby N+M było możliwie małe ;)
LU
@Shalom: Wtedy te zapisy wszystkie byłyby w tym module repository i bym przekazywał pewnie jakiś transfer object tam a moduł repository byłby odpowiedzialny za aktualizację bazy. A w domenie bym musiał mieć zawsze tylko jedno wywołanie repository per przypadek użycia. Z tego co pamiętam to shedlock tak działa, że można podpiąć różne data providery. Ale nie wiem może coś mieszam stąd ten wątek czy warto to tak odseparowywać robiąc oddzielny moduł na storowanie, który jest odpowiedzialny za transakcyjność itp. a w domenie już nas nie interesuje jak to jest storowane.
Charles_Ray
Coś mi się wydaje, że mieszasz pojęcia i oddalasz się od tego, co tak naprawdę chcesz osiągnąć
LU
Dlaczego? Po prostu zastanawiam się nad jedną i drugą architekturą i porównuję plusy i minusy ;)
SH
SH
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad 3 lata
  • Postów:69
1

"Transactional w warstwie serwisu czy dao"

@Transactional ? Nigdzie.
Transakcje pisane "ręcznie", kodem

edytowany 1x, ostatnio: Stój Halina
Skoq
  • Rejestracja:około 6 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Kraków
  • Postów:255
0
Stój Halina napisał(a):

"Transactional w warstwie serwisu czy dao"

@Transactional ? Nigdzie.
Transakcje pisane "ręcznie", kodem

Skoro w projekcie jest spring to po co ręcznie to robić? Sam nie jestem jakimś wielkim fanem springa ale używanie go z głową nie powinno powodować wielu problemów. Już nie przesadzajmy…


I tak to właśnie jest
PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:4 miesiące
  • Postów:2787
3
Skoq napisał(a):
Stój Halina napisał(a):

Transakcje pisane "ręcznie", kodem

Skoro w projekcie jest spring to po co ręcznie to robić? Sam nie jestem jakimś wielkim fanem springa ale używanie go z głową nie powinno powodować wielu problemów. Już nie przesadzajmy…

Tylko że oprócz @Transactional, można użyć TransactionTemplate, również ze Springa, a daje większą kontrolę - https://www.baeldung.com/spring-programmatic-transaction-management

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.