W SQL Server domyślnie działa auto-commit transaction, więc jaki jest sens dodawać @Transactional
dla np. metody save()
?
@Transactional
domyślnie ma propagation=Propagation.REQUIRED
czyli jeśli jest już otwarta jakaś transakcja to dopisze następny insert do istniejącej? W takim wypadku nie powinno się zawsze zmieniać na REQUIRED_NEW
?
Wyobraź sobie że masz konto A ze stanem konta 50k, i konto B ze stanem 10k.
Jak nie masz @Transactional to każda operacja jest osobno commitowana, więc jak przelewasz z konta A do konta B 10k, i pierwsza transakcja przejdzie, ale drugia nie to na A będzie 40k a na B dalej 10k.
@Transactional domyślnie ma propagation=Propagation.REQUIRED czyli jeśli jest już otwarta jakaś transakcja to dopisze następny insert do istniejącej? W takim wypadku nie powinno się zawsze zmieniać na REQUIRED_NEW?
Nie za bardo rozumiem. W Springu masz na ogół transakcje powiązane z wątkiem, a wątek z requestem HTTP. Różne requesty są powiązane z różnymi transakcjami, wiec to że jakiś Janek przelewa sobie hajs w banku nie ma powiązania z tym ze Ty sobie robisz przelew.
Domyślnie Spring Data ma @Transactional na metodzie save, chyba tylko po to żeby jakoś to działało by default.
Pod spodem jest używany EntityManager, który już nie ma zakładanej transakcji i musisz to zrobić samodzielnie na warstwie wyżej.
Żeby zgrupować kilka komend w jedną i mieć pewność, że wykonają się albo wszystkie, albo żadna, a jednocześnie móc to zrobić udając, że bazy danych nie ma.
Po pierwsze musisz ogarnąć po co są w ogóle transakcje w SQL (po co są potrzebne?). Właśnie autocommit to nie za dobra opcja w większości aplikacji.
Po drugie @Transactional
w Springu, a transakcja w SQL to nie to samo. @Transactional
wpływa na "granice transakcji SQL" (begin/commit), ale robi też trochę innych rzeczy. Np. wpływa na to kiedy dane będą "insertowane/updatowane" w bazie danych (jesli używasz JPA). Do tego dochodzi kwestia zagnieżdżania wywołań metod transactional.
Po trzecie - puty nie jesteś ogarniaczem to używaj domyślnego progagation. 12 na 10 młodych programistów używa REQUIRES_NEW
źle i robi sobie krzywdę. Jestes ogarniaczem, jak wiesz dość dobrze jak działa JPA, między innych, pessimistic lock, optimistic lock, managed, detached i rozumiesz poziomy izolacji transakcji.