# Transactions Instructions Aktualisiert: 2025-10-20 ## Kontext Container-Managed Transaktionen (Java EE). Verwendung von `@Transactional` auf Manager-Methoden für Schreiboperationen. ## Grundsätze - Jede persistierende Operation (create, edit, remove) innerhalb einer Transaktion. - `save` und `saveAll` bereits mit `@Transactional` versehen. - Leseoperationen können ohne Annotation auskommen (Default: kein Write-Lock nötig). ## Batch Operationen - `saveAll(Collection)`: Ein Transaktionskontext für gesamte Collection -> entweder komplett erfolgreich oder Abbruch beim Fehler. - Optimierungspotential: Fehler sammeln, nicht sofort abbrechen. ## Refresh - `refresh(entity)` führt merge aus; wenn `id == null` vorher persist -> bleibt innerhalb Transaktion falls aufgerufen durch `save`/`saveAll`. ## Remove - `remove(entity)` ohne `@Transactional` in Basisklasse -> Empfehlung: Annotation hinzufügen in konkretem Manager wenn Delete-Fachlogik erweitert wird. ## Edge Cases - Verschachtelte Aufrufe (save -> intern create/edit): Container handhabt Propagation (`REQUIRED`). - LazyInitializationException vermeiden: innerhalb Transaktion initialisieren. ## Empfohlene Annotationen - Zusätzliche fachliche Write-Methoden stets mit `@Transactional` versehen. - Pure Read: Performancekritisch -> ggf. explizit `@Transactional(Transactional.TxType.SUPPORTS)` oder weglassen. ## Fehlerfall Verhalten - Ungefangene RuntimeException -> Rollback durch Container. - Aktuell Exceptions geloggt & boolean false -> verhindert Rollback. Verbesserung: BusinessException throw + Rollback. ## Generator Leitplanken - Keine eigenen manuell geöffneten Transaktionen (kein `UserTransaction`). - Konsistenz: Schreibmethoden annotieren, Leseoperationen nur bei Bedarf. ---