2016-10-26 6 views
0

Kürzlich Refactoring einige Code, kam über Transaktion Rollback-Szenario, wo eine EJB-Bean eine andere aufruft. Im Ausnahmeblock hat nun jede Bean ihren Kontext, der für den Rollback markiert ist.Transaktion über mehrere EJBs

Ist dies eine gute Praxis oder sollten sie einfach die Ausnahme & erneut werfen, schließlich die Initiator-Bean nur das Rollback.

Wenn eine einzelne Transaktion übergreifend auf EJBs verteilt ist, sollte das Rollback auf der Ursprungs-Bean oder an der Stelle erfolgen, an der die Ausnahme aufgetreten ist.

Transaktionsart JTA für Persistenz mit XA-Datenquelle.

Antwort

1

Mit diesem

ist für Rollback markiert

Sie bedeuten, dass die EJB die Ausnahme abfangen und setRollbackOnly verwenden?

Wenn das der Fall ist, dann hängt es von Ihrem Entwurf ab zu entscheiden, welcher Ansatz bevorzugt wird.

Normalerweise wird eine Transaktion zurückgesetzt, wenn vom Container eine Systemausnahme festgestellt wird. Anwendungsausnahme auf der anderen Seite hat diesen Effekt nicht.

Aber, wenn Sie Ihre Business-Logik erfordert, dass selbst eine Geschäfts Ausnahme hat einen bedeutenden Einfluss, dass sie die Wirkung der Rollback der gesamten Transaktion haben müssen, dann haben Sie die Wahl von setRollBackOnly oder eine Anwendung starten Ausnahme mit rollback=true.

Dieser zweite Ansatz hat auch die Wirkung, die Bohne nicht zu zerstören.

In Bezug auf Ihre zweite Frage:

Auch wenn einzelne Transaktion über EJB aufgespannt wird, dann Rollback an den Urheber Bean passieren sollte oder wo es Ausnahme aufgetreten.

Der Rollback wird vom Container verwaltet, und es hängt wieder von Ihrem Design ab. Denken Sie daran, dass der Fehler möglicherweise durch das Loch Ihrer eigenen Bean passiert, die für das Zurückrollen der Transaktion verantwortlich ist und überhaupt nicht erfasst wird. Sie werden also mit einem unerwünschten Szenario enden, bei dem eine Transaktion überhaupt nicht zurückgesetzt wird.

+0

+1 Ja, es ist sehr designspezifisch. Aber wegen einiger komplizierter Szenarien, sollten Sie keine Dinge irgendwo dazwischen verlieren. Es können auch einige andere Beans in einem zukünftigen Flow hinzugefügt werden und dann müssen sie verfolgen, was mit der Transaktion vor und nach passiert; Daher denke ich, dass jede Bohne unabhängig ohne äußere Abhängigkeit zurechtkommen sollte. Es ist eher eine Designfrage und -praxis, der man folgen sollte. –

+0

Ein anderer recht häufiger Ansatz, den ich oft gesehen habe, ist, eine Ausnahme auf Bean-Ebene zu fangen und eine EJBException oder eine benutzerdefinierte Ausnahme, die EJBException erweitert, erneut zu werfen. Auf diese Weise können Sie immer noch protokollieren, was falsch gelaufen ist, und den Vorteil nutzen, dass der Container die Transaktion zurücksetzt. – Leonardo

Verwandte Themen