javax.transaction.Transactional vs. org.springframework.transaction.annotation.Transactional

Lesezeit: 5 Minuten

Benutzer-Avatar
Staubblätter

Ich verstehe nicht, was der tatsächliche Unterschied zwischen Anmerkungen ist javax.transaction.Transactional und org.springframework.transaction.annotation.Transactional?

Ist org.springframework.transaction.annotation.Transactional eine Erweiterung von javax.transaction.Transactional oder haben sie eine ganz andere bedeutung? Wann sollten sie jeweils verwendet werden? Frühling @Transactinal in Dienstschicht und Javax im DAO?

Danke für die Antwort.

Spring hat vor Jahren eine eigene transaktionale Annotation definiert, um Spring-Bean-Methoden transaktionsfähig zu machen.

Java EE 7 hat endlich das Gleiche getan und ermöglicht jetzt zusätzlich zu EJB-Methoden, dass CDI-Bean-Methoden transaktional sind. Seit Java EE 7 definiert es also auch seine eigene Transaktions-Annotation (es kann natürlich die Spring-Annotation nicht wiederverwenden).

In einer Java EE 7-Anwendung verwenden Sie die Java EE-Annotation.

In einer Spring-Anwendung verwenden Sie die Spring-Annotation.

Ihre Verwendung ist dieselbe: Den Container (Java EE oder Spring) darüber informieren, dass eine Methode transaktional ist.

  • Mehr noch: Um das Universum zu beherrschen, fügte Spring auch implizite Unterstützung für hinzu javax.transaction.Transactional so könnte man es jetzt auch in Spring-Anwendungen ohne zusätzliche Aktionen verwenden. Meiner Meinung nach, Dies war aus gestalterischer Sicht eine ziemlich schlechte Entscheidungda meiner Erfahrung nach viele Entwickler diese beiden unbewusst in ihrem Code verwechseln, was später zu Problemen führt.

    – Juri Nakonechny

    31. Oktober 2016 um 16:24 Uhr

  • Außerdem, org.springframework.transaction.annotation.Transactional bietet mehr Optionen (z readOnly, timeout) als javax.transaction.Transactional

    – pierrefevrier

    20. April 2017 um 11:37 Uhr

  • @yura, welche Probleme hast du beobachtet?

    – Lee Chee Kiam

    15. Juli 2017 um 10:20 Uhr


  • @LeeCheeKiam, siehe unten zwei Antworten

    – Juri Nakonechny

    17. Juli 2017 um 8:37 Uhr

  • “Java EE 7 hat endlich dasselbe getan” ist ziemlich irreführend: Diese Anmerkung existiert seit EJB 3.0, eigentlich ungefähr zur gleichen Zeit, als Spring eine solche Anmerkung hatte (in 1.2). Die Unterstützung in CDI war ziemlich “neu”, als dies veröffentlicht wurde (aber das war auch CDI).

    – Ymajoros

    14. Februar um 8:48 Uhr

Ein weiterer Unterschied besteht darin, wie Spring die @Transactional-Anmerkungen behandelt

  • org.springframework.transaction.annotation.Transactional wird immer berücksichtigt
  • javax.transaction.Transaktional wird nur berücksichtigt, wenn EJB3-Transaktionen vorhanden sind. Das Vorhandensein von EJB3-Transaktionen wird durch Überprüfen der Klasse durchgeführt javax.ejb.TransactionAttribute ist im Klassenpfad verfügbar (von Version 2.5.3 bis 3.2.5). Daher kann es passieren, dass Ihre Anmerkungen nicht berücksichtigt werden, wenn auch nur javax.transaction.Transactional in Ihrem Klassenpfad ist und nicht javax.ejb.TransactionAttribute. Dies kann der Fall sein, wenn Sie mit Hibernate arbeiten: hibernate-core (4.3.7.Final) hängt von jboss-transaction-api_1.2_spec (1.0.0.Final) ab, was nicht bereitgestellt wird javax.ejb.TransactionAttribute.

Benutzer-Avatar
Lyju ich Edwinson

Bitte seien Sie vorsichtig, (dieses Problem ist in Tomcat aufgetreten),

Wenn Ihre Anwendung eine SPRING-Webanwendung ist und Sie den Transaktionsverarbeitungsmechanismus von Spring verwenden, ist dies der Fall @org.springframework.transaction.annotation.Transactionaldann mischen Sie es nicht mit javax.transaction.Transactional.

Das ist immer verwenden, @org.springframework.transaction.annotation.Transactional in einer Federanwendung konsequent.

Andernfalls können wir mit diesem Fehler enden,

org.springframework.orm.jpa.JpaSystemException: commit failed; nested exception is org.hibernate.TransactionException: commit failed

........

Caused by: java.sql.SQLException: Protocol violation: [0]

  • Hinweis: Diese Antwort ist ein Sonderfall meiner Antwort

    – Jidehem

    9. November 2017 um 10:19 Uhr

Benutzer-Avatar
Vlad Mihalcea

Deklarativer Transaktionsbereich

Sowohl der Frühling als auch die JPA @Transaction Anmerkungen ermöglichen es Ihnen, den Umfang einer bestimmten Anwendungstransaktion zu definieren.

Wenn also eine Dienstmethode mit der Anmerkung versehen ist @Transactional Anmerkung, wird es in einem Transaktionskontext ausgeführt. Wenn die Dienstmethode mehrere DAOs oder Repositorys verwendet, werden alle Lese- und Schreibvorgänge in derselben Datenbanktransaktion ausgeführt.

Frühling @Transactional

Das org.springframework.transaction.annotation.Transactional Annotation ist seit der Version 1.2 des Spring-Frameworks (ca. 2005) verfügbar und ermöglicht es Ihnen, die folgenden Transaktionseigenschaften festzulegen:

  • isolation: die zugrunde liegende Datenbank-Isolationsstufe
  • noRollbackFor und noRollbackForClassName: die Liste von Java Exception Klassen, die ausgelöst werden können, ohne ein Transaktions-Rollback auszulösen
  • rollbackFor und rollbackForClassName: die Liste von Java Exception Klassen, die beim Auslösen ein Transaktions-Rollback auslösen
  • propagation: der Transaktionsweitergabetyp, der von angegeben wird Propagation Aufzählung. Wenn beispielsweise der Transaktionskontext vererbt werden kann (z. B. REQUIRED) oder ein neuer Transaktionskontext erstellt werden soll (z. B. REQUIRES_NEW) oder ob eine Ausnahme ausgelöst werden soll, wenn kein Transaktionskontext vorhanden ist (z. B. MANDATORY) oder ob eine Ausnahme ausgelöst werden soll, wenn ein aktueller Transaktionskontext gefunden wird (z. B. NOT_SUPPORTED).
  • readOnly: ob die aktuelle Transaktion nur Daten lesen soll, ohne Änderungen anzuwenden.
  • timeout: Wie viele Sekunden soll der Transaktionskontext laufen dürfen, bis eine Timeout-Ausnahme ausgelöst wird.
  • value oder transactionManager: der Name des Frühlings TransactionManager Bean, die beim Binden des Transaktionskontexts verwendet werden soll.

Java-EE @Transactional

Das javax.transaction.Transactional Anmerkung wurde durch die Java EE 7-Spezifikation (ca. 2013) hinzugefügt. Die Java EE-Annotation wurde also 8 Jahre später als ihr Spring-Pendant hinzugefügt.

Die Java-EE @Transactional definiert nur 3 Attribute:

  • dontRollbackOn: die Liste von Java Exception Klassen, die ausgelöst werden können, ohne ein Transaktions-Rollback auszulösen
  • rollbackOn: die Liste von Java Exception Klassen, die beim Auslösen ein Transaktions-Rollback auslösen
  • value: die Ausbreitungsstrategie, gegeben durch die TxType Aufzählung. Wenn beispielsweise der Transaktionskontext vererbt werden kann (z. B. REQUIRED) oder ein neuer Transaktionskontext erstellt werden soll (z. B. REQUIRES_NEW) oder ob eine Ausnahme ausgelöst werden soll, wenn kein Transaktionskontext vorhanden ist (z. B. MANDATORY) oder ob eine Ausnahme ausgelöst werden soll, wenn ein aktueller Transaktionskontext gefunden wird (z. B. NOT_SUPPORTED).

Welche soll man wählen?

Wenn Sie Spring oder Spring Boot verwenden, verwenden Sie Spring @Transactional Anmerkung, da Sie damit mehr Attribute konfigurieren können als mit Java EE @Transactional Anmerkung.

Wenn Sie nur Java EE verwenden und Ihre Anwendung auf einem Java EE-Anwendungsserver bereitstellen, verwenden Sie Java EE @Transactional Anmerkung.

1354320cookie-checkjavax.transaction.Transactional vs. org.springframework.transaction.annotation.Transactional

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy