Interviewfrage für Java-Entwickler

Jemand setzt Transactional auf eine Methode und es scheint nicht zu wirken. Was sind die üblichen Gründe?

Worauf der Interviewer abzielt, wie du deine Antwort aufbaust und ein gesprochenes Beispiel zum Anpassen.

Kurzantwort

Die Annotation wird über einen Proxy umgesetzt, sie greift also nur, wenn der Aufruf von außen durch die Bean geht. Ein Aufruf aus einer anderen Methode derselben Klasse umgeht den Proxy komplett, und das ist die häufigste Ursache. Andere Gründe: die Methode ist nicht public, die geworfene Exception ist checked und löst per Default kein Rollback aus, die Bean wurde außerhalb des Containers erzeugt, oder es war eine neue Transaktion nötig und die Propagation blieb auf required.

Warum Interviewer das fragen

Das ist eine praktische Spring-Frage mit mehreren richtigen Antworten, sie zeigt also Tiefe und echte Debugging-Erfahrung. Der Interviewer will das Proxy-Problem bei Selbstaufrufen zuerst genannt hören, dazu die Rollback-Regel zu Checked Exceptions, die Leute überrascht. Nachfragen gehen meist zu Propagation, dazu, was in eine Transaktion gehört, und dazu, warum lange Transaktionen, die eine Verbindung halten, gefährlich sind.

So baust du deine Antwort auf

  • Fang beim Proxy-Modell an, es erklärt die meisten Fehlschläge.
  • Behandle Selbstaufrufe und die Sichtbarkeitsanforderungen.
  • Nenn die Default-Rollback-Regel und wie man sie ändert.
  • Ergänze, was überhaupt nicht in eine Transaktion gehört.

Beispielantwort

Gesprochenes Beispiel, erste Person

In neun von zehn Fällen ist es der Selbstaufruf. Spring wickelt die Bean in einen Proxy, und die Transaktion startet, wenn ein Aufrufer durch diesen Proxy geht. Ruft also eine public Methode derselben Klasse die annotierte Methode direkt auf, verlässt der Aufruf das Objekt nie und es beginnt keine Transaktion. Der Fix ist, die Methode in eine andere Bean zu verschieben oder die Bean in sich selbst zu injizieren, und der ehrliche Fix ist meist, dass die Grenze sowieso an der falschen Stelle saß. Danach prüfe ich die Basics: die Methode sollte public sein, die Bean muss Spring-verwaltet sein und nicht mit new erzeugt, und die Rollback-Regel erwischt viele, weil per Default nur bei Unchecked Exceptions zurückgerollt wird, eine Checked Exception committet also, solange ich kein rollbackFor angebe. Ich schaue außerdem auf die Propagation, denn Arbeit, die das Rollback des Aufrufers überleben muss, braucht requires new, und das kostet eine zweite Verbindung, was bei kleinem Pool zählt. Und ich halte Transaktionen kurz: keine HTTP-Calls, kein Publishing von Nachrichten, kein Warten auf irgendetwas darin, denn eine Datenbankverbindung zu halten, während man einen Drittanbieter anruft, ist der schnellste Weg, einen Pool leerzuräumen.

Steht dieses Vorstellungsgespräch bald an? GhostPilot hört bei deinem Live-Call mit, erkennt die Frage in dem Moment, in dem sie gestellt wird, und bringt dir eine strukturierte Antwort in Echtzeit auf den Bildschirm. Probier es im nächsten Mock aus, oder hol dir einen $29 Session Pass, kein Abo, für den Ernstfall.

So funktioniert es

Nachfragen, mit denen du rechnen solltest

  • Was macht Propagation requires new tatsächlich mit dem Connection Pool?
  • Warum kann das Fangen einer Exception innerhalb einer Transaktion trotzdem ein Rollback auslösen?
  • Wie würdest du ein Event erst nach dem Commit der Transaktion publizieren?

Weitere Fragen für Java-Entwickler

Dein Interviewer stellt seine eigene Version davon. Kopier deine echte Stellenbeschreibung in den kostenlosen Question Predictor und bekomm die 20 Fragen, die diese Rolle am wahrscheinlichsten stellt, samt dem, worauf jede wirklich abzielt.

Meine Fragen vorhersagen

Üb die harten Fragen, bevor sie gestellt werden

Trainier mit einem Live-Copiloten und geh dann vorbereitet rein. Ein $29 Session Pass bringt dich durch das Vorstellungsgespräch, ohne Abo und ohne Bindung.

GhostPilot holen