Version 4 · Migration

Transaktionen, JTA, JMS und Datenbank

Globale Containertransaktionen werden analysiert, abgesichert und schrittweise durch klare lokale Transaktionen, Outbox und idempotente Consumer ersetzt.

Migration-ÜbersichtStartseite
Warum Transaktionen der harte Kern sind

Viele WebSphere-Systeme nutzen JTA/XA über Datenbank, JMS und manchmal SOAP-Folgeaufrufe. Das ist im Monolith bequem, wird aber in verteilten Containerlandschaften teuer und störanfällig. Deshalb wird nicht blind XA nachgebaut, sondern die fachliche Konsistenz neu modelliert.

Zwischenzustand: explizite Transaktion plus Outbox
Transaktionsschnitt mit markiertem Outbox Pattern
public class InvoiceApplicationService {
    // Pattern: Transaction Script als Zwischenzustand, danach schrittweise zu Domain Model.
    @Transactional
    public InvoiceResult create(CreateInvoiceCommand command) {
        Invoice invoice = useCase.handle(command);
        // Pattern: Transactional Outbox - Event wird in derselben DB-Transaktion vorgemerkt.
        outbox.store(OutboxMessage.from(invoice.createdEvent()));
        return InvoiceResult.ok(invoice.number(), invoice.total());
    }
}
Migrationsentscheidung
FallEmpfohlene Richtung
Eine DB, ein ServiceLokale Transaktion genügt meistens.
DB + EventTransactional Outbox statt direktem Senden in derselben Methode.
DB + MQ mit exakt-einmal WunschIdempotenz, Inbox/Outbox, fachlicher Dedupe-Key.
Mehrere ServicesSaga / Process Manager statt globaler JTA über Servicegrenzen.
Stored Procedure als RegelkernGolden Master Tests, dann Regel extrahieren oder bewusst kapseln.
Fehlerbilder
FehlerGegenmaßnahme
Doppelte NachrichtConsumer idempotent machen, Nachrichtenschlüssel speichern.
Commit erfolgreich, Event fehltOutbox-Relay mit Wiederholung und Monitoring.
Event gesendet, DB rollbackEvent erst nach Commit aus Outbox veröffentlichen.
Langlaufende SperrenTransaktionsumfang verkleinern, Batch-Schnitt prüfen.
⌂ Cockpit