Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

Java EE 7 Grundkurs

Transaktionen

Testen Sie unsere 2019 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Die Definition von Transaktionen erfolgt in der EJB-Lite-Spezifikation entweder programmatisch im Quellcode einer Methode oder deklarativ per Annotation. Diese besitzen besonders bei komplexen Applikationen wichtige Aufgaben.

Transkript

In diesem Video werden wir uns mit Transaktionen befassen. Transaktionen sind ja Mechanismen, mit denen verteilte oder zusammengesetzte Vorgänge zusammengefasst werden können. Wenn ein Teilschritt schiefläuft, dann wird die ganze Transaktion zurückgerollt. Dafür gibt es natürlich eine Unterstützung im Java-EE-Umfeld. Und dieser Unterstützung werden wir uns hier widmen. Wenn wir auf der Java-EE-Ebene von Transaktionen reden, dann reden wir entweder von sogenannten Container Managed Transactions oder von Bean Managed Transactions. Der Unterschied besteht darin, dass entweder der Java-EE-Application-Container oder aber die Beans selber dafür verantwortlich sind, dass Transaktionen stattfinden und wie diese Transaktionen stattfinden. Standardmäßig sprechen wir von Container Managed Transactions. Wir können dies allerdings ändern, dieses Verhalten, und zwar, indem wir auf Ebene einer Bean die TransactionManagement- Annotation verwenden. Diese TransactionManagement- Annotation kann zwei mögliche Werte entgegennehmen, nämlich "BEAN", das bedeutet dann, dass die Bean sich selbst um die Transaktionen kümmert, das heißt wir müssen uns eine Instanz der UserTransaction- Klasse injizieren lassen, oder "CONTAINER", wie gesagt, das ist der Standardwert. Und in dem Fall werden die Transaktionen vom Container selbst verwaltet. Wenn Sie mit Bean Managed Transaction arbeiten wollen, dann sieht das so aus wie in diesem Beispiel. Hier wird am Kopf der Klasse das Transaktions-Management auf den Wert "BEAN" gesetzt. Ebenfalls wird innerhalb der Klasse eine Injektion erwartet, nämlich einer UserTransaction-Instanz. Diese ist als "Resource" annotiert. Sie können statt "Resource" auch "Inject" verwenden. Das hat den gleichen Effekt. Innerhalb der Methode wird dann die Transaktion gestartet mit "tx", das ist die lokale Variable, ".begin()". Wenn diese Transaktion erfolgreich war, dann wird sie commited. Wenn irgendetwas schiefgelaufen ist, dann kann man sie über die Methode "rollBack" zurückrollen, und alle Änderungen, die im Kontext der Transaktion vorgenommen worden sind, werden dann verworfen. Bei der Container-Managed- Transaction-Steuerung ist es so, dass wir das genaue Verhalten dann auf Methodenebene beziehungsweise, wenn es für alle Methoden gelten soll, auf Klassenebene steuern können. Es gibt hier an der Stelle sechs Transaktionsattribute. Die werden wir jetzt kurz einmal durchsprechen, damit Sie wissen, welche unterschiedliche Bedeutung diese Transaktionsattribute haben. Das Standard-Transaktionsattribut ist "Required". Das bedeutet, dass, wenn eine Transaktion bereits aktiv ist, diese Transaktion verwendet wird. Wenn keine Transaktion aktiv ist, wird eine neue Transaktion gestartet. Das Attribut "RequiresNew" sorgt dafür, dass, wenn eine Transaktion aktiv ist, diese Transaktion unterbrochen wird. Und es wird eine neue Transaktion gestartet. Wenn keine Transaktion aktiv ist, wird ebenfalls eine neue Transaktion gestartet. Dies bietet sich zum Beispiel an, wenn eine Methode selbst nochmal Teilschritte definieren soll, die unabhängig von der Haupttransaktion laufen. Das Transaktionsattribut "Mandatory" besagt: wenn eine Transaktion aktiv ist, dann wird genau diese Transaktion verwendet. Wenn aber keine Transaktion aktiv ist, dann gibt es eine Exception. Das heißt, der Aufruf der Methode schlägt fehl. Das Transaktionsattribut "NotSupported" besagt: Wenn eine Transaktion aktiv ist, dann wird sie unterbrochen. Und wenn keine Transaktion aktiv ist, dann wird auch keine erzeugt. Mit Hilfe des Transaktionsattributs "Supports" können Sie angeben, dass, wenn eine Transaktion aktiv ist, diese Transaktion verwendet wird. Und wenn keine Transaktion aktiv ist, dann wird eben keine Transaktion verwendet. Und es gibt auch noch die Möglichkeit, zu sagen: Eine Methode soll niemals in einem Kontext einer Transaktion ausgeführt werden können. Dann verwenden Sie das Transaktionsattribut "Never". Dieses besagt, dass, wenn die Transaktion aktiv ist, eine RemoteException geworfen wird. Und wenn keine Transaktion aktiv ist, dann wird keine Transaktion erzeugt. Wenn Sie so etwas verwenden wollen, dann, wie gesagt, können Sie auf Klassenebene definieren, wie sich normalerweise alle Methoden verhalten sollen. Machen Sie das nicht, gilt als Standardwert das Transaction-Attribut mit dem Wert "Required". Hier in diesem Beispiel wird das Transaktionsattribut auf "NotSupported" gesetzt. Das bedeutet, dass alle Methoden, die nicht speziell mit einem anderen Transaktionsattribut versehen werden, beim Aufruf entweder keine Transaktion erwarten oder, wenn eine Transaktion läuft, diese unterbrechen. Die Methode "firstMethod" erzeugt dagegen bei jedem Aufruf eine neue Transaktion, egal, ob bereits eine aktiv war oder nicht. Und die Methode "secondMethod" nutzt eine bereits existierende Transaktion oder erzeugt eine neue, wenn noch keine Transaktion existiert. Sie können das sehr gezielt einsetzen, je nachdem, was Sie für Bedürfnisse in den verschiedenen Methoden Ihrer Applikation haben. Wenn es innerhalb einer Methode zu einem Fehler kommt, dann wird automatisch ein Rollback durchgeführt. Dies erledigt der Container für Sie, vorausgesetzt, Sie haben die Exception nicht abgefangen. Sie können das allerdings auch manuell machen. Dann verwenden Sie die Methode "setRollbackOnly". Sie müssen sich dafür lediglich eine EJBContext-Instanz injizieren lassen. In diesem Video haben wir uns mit Transaktionen befasst. Wir haben geklärt, welche beiden Möglichkeiten der Transaktionssteuerung, nämlich auf Container-Ebene oder auf Bean-Ebene, es gibt. Wenn Sie auf Bean-Ebene die Transaktionssteuerung selbst in die Hand nehmen wollen, müssen Sie sich eine UserTransaction injizieren lassen und sind dann selbst für Start und Ende von Transaktionen zuständig. Beachten Sie bitte, dass beispielsweise die JPA bei Ihren verschiedenen Operationen stets eine aktive Transaktion erwartet. Wenn Sie Transaktionssteuerung auf Ebene von Containern vornehmen lassen wollen, dann brauchen Sie normalerweise nichts umzustellen. Das Einzige, was Sie dort üblicherweise tun, ist, dafür zu sorgen, dass die Methoden in einem der sechs standardmäßig vorhandenen Transaktionskontexte laufen. Und das passen Sie an Ihre Bedürfnisse an, indem Sie entweder auf Klassenebene oder auf Methodenebene den gewünschten Transaktionskontext annotieren. Rollbacks werden dann normalerweise vom Container vorgenommen oder von Ihnen händisch. Dafür benötigen Sie allerdings eine EJBContext-Instanz. Sie sehen: Die Arbeit mit Transaktionen ist gar nicht so schwierig. Sie müssen nur wissen, welches Transaktionsmodell Sie für welches Szenario benötigen.

Java EE 7 Grundkurs

Lernen Sie die Grundlagen der Programmierung mit Java EE 7 verstehen und anwenden.

6 Std. 4 min (44 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!