Zestawy rozmówBlog

Twoja wymarzona praca? Lets Git IT.
Interaktywna platforma przygotowująca do rozmów technicznych dla nowoczesnych programistów.

XGitHub

Platforma

  • Kategorie

Zasoby

  • Blog
  • O aplikacji
  • FAQ
  • Sugestie

Prawne

  • Polityka prywatności
  • Regulamin

© 2026 LetsGit.IT. Wszelkie prawa zastrzeżone.

LetsGit.IT/Kategorie/Spring
Springmedium

Jak działa `@Transactional` (rollback + typowa pułapka)?

Tagi
#transaction#transactional#rollback
Wróć do kategoriiPrzejdź do quizu

Odpowiedź

Uruchamia metodę w transakcji; domyślnie Spring robi rollback na unchecked (`RuntimeException`). Typowa pułapka to self-invocation: wywołanie `@Transactional` z tej samej klasy omija proxy, więc transakcja może się nie uruchomić.

@Service
class PaymentService {
  @Transactional
  public void pay() {
    // DB writes here
  }
}

Odpowiedź zaawansowana

Głębiej

W większości aplikacji Spring implementuje `@Transactional` przez AOP **proxy**. Proxy otwiera transakcję przed wykonaniem metody i robi commit/rollback po jej zakończeniu.

Reguły rollback (domyślne)

Spring robi rollback dla:

  • `RuntimeException`
  • `Error`

Checked exceptions **nie** powodują rollback, jeśli tego nie ustawisz:

@Transactional(rollbackFor = Exception.class)

Czemu self-invocation jest problemem

Transakcja działa tylko, gdy wywołanie przejdzie **przez proxy**. `this.jakiesTransactional()` zostaje „w środku” beana i omija proxy.

Praktyka

  • Granice transakcji ustawiaj w warstwie serwisowej (granice use-case’ów).
  • Nie „połykaj” wyjątków, jeśli chcesz rollback.
  • Propagation/isolation ustawiaj świadomie.

Typowe pułapki

  • Łapanie wyjątków i zwracanie „OK” (transakcja się commituje).
  • `@Transactional` na metodach private/final (ograniczenia proxy zależą od setupu).
  • Wynoszenie lazy encji JPA poza transakcję (kończy się `LazyInitializationException`).

Powiązane pytania

Spring
Propagation w transakcjach Spring — co oznacza `REQUIRED`?
#transaction#propagation#spring
Spring
Proxy w Spring AOP — na czym polega problem self-invocation?
#aop#proxy#transactional
Spring
Jak działa @Transactional?
#transaction
#aop
#database
Monolity
Jak bezpiecznie wprowadzić breaking change w bazie danych w dużym monolicie?
#db-migration#expand-contract#deployment
Bazy danych
Co to jest transakcja i po co jej używamy?
#transaction#acid#consistency