Po co używać @Transactional w Springu, jak każda operacja jest wykonywana jako transakcja w bazie danych?

0

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?

4

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.

2

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.

0

Ż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.

3

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.

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