Ich verstehe nicht, was der tatsächliche Unterschied zwischen Anmerkungen javax.transaction.Transactional
und ist 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 sollte jeder von ihnen verwendet werden? Frühling @Transactinal
in der Serviceschicht und Javax in DAO?
Danke für die Antwort.
javax.transaction.Transactional
sodass man es jetzt auch in Spring-Anwendungen ohne zusätzliche Aktionen verwenden kann. IMO, dies war vom Design-Standpunkt aus eine ziemlich schlechte Entscheidung , da viele Entwickler meiner Erfahrung nach diese beiden unbewusst in ihrem Code verwechseln, was später zu Problemen führt.org.springframework.transaction.annotation.Transactional
bietet mehr Optionen (wiereadOnly
,timeout
) alsjavax.transaction.Transactional
Ein weiterer Unterschied besteht darin, wie Spring mit den @ Transactional-Annotationen umgeht
javax.ejb.TransactionAttribute
im Klassenpfad verfügbar ist (von Version 2.5.3 bis 3.2.5). So können Sie dazu führen, dass Ihre Anmerkungen nicht berücksichtigt werden, wenn sie sich nurjavax.transaction.Transactional
in Ihrem Klassenpfad befinden und nichtjavax.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, das dies nicht bietetjavax.ejb.TransactionAttribute
.quelle
Bitte seien Sie vorsichtig (dieses Problem ist in Tomcat aufgetreten).
Wenn es sich bei Ihrer Anwendung um eine SPRING-Webanwendung handelt und Sie den Transaktionsbehandlungsmechanismus von Spring verwenden,
@org.springframework.transaction.annotation.Transactional
mischen Sie ihn nicht mit javax.transaction.Transactional.Das ist immer
@org.springframework.transaction.annotation.Transactional
in einer Federanwendung konsequent zu verwenden.Andernfalls kann es zu diesem Fehler kommen.
quelle
Deklarativer Transaktionsumfang
Sowohl mit der Spring- als auch mit der JPA-
@Transaction
Annotation können Sie den Umfang einer bestimmten Anwendungstransaktion definieren.Wenn eine Servicemethode mit der
@Transactional
Annotation kommentiert wird , wird sie in einem Transaktionskontext ausgeführt. Wenn die Servicemethode mehrere DAO oder Repositorys verwendet, werden alle Lese- und Schreibvorgänge in derselben Datenbanktransaktion ausgeführt.Frühling
@Transactional
Die
org.springframework.transaction.annotation.Transactional
Anmerkung 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 DatenbankisolationsstufenoRollbackFor
undnoRollbackForClassName
: die Liste der Java-Exception
Klassen, die ausgelöst werden können, ohne ein Transaktions-Rollback auszulösenrollbackFor
undrollbackForClassName
: die Liste der Java-Exception
Klassen, die beim Auslösen einen Transaktions-Rollback auslösenpropagation
: Der von derPropagation
Aufzählung angegebene Transaktionsausbreitungstyp . Zum Beispiel, wenn der Transaktionskontext vererbt werden kann (z. B.REQUIRED
) oder ein neuer Transaktionskontext erstellt werden soll (z. B.REQUIRES_NEW
) oder wenn eine Ausnahme ausgelöst werden soll, wenn kein Transaktionskontext vorhanden ist (z. B.MANDATORY
) oder wenn eine Ausnahme ausgelöst werden soll wenn ein aktueller Transaktionskontext gefunden wird (zNOT_SUPPORTED
. B. ).readOnly
: ob die aktuelle Transaktion nur Daten lesen soll, ohne Änderungen vorzunehmen.timeout
: Wie viele Sekunden sollte der Transaktionskontext ausgeführt werden dürfen, bis eine Timeout-Ausnahme ausgelöst wird.value
odertransactionManager
: der Name der SpringTransactionManager
Bean, die beim Binden des Transaktionskontexts verwendet werden soll.Java EE
@Transactional
Die
javax.transaction.Transactional
Anmerkung wurde durch die Java EE 7-Spezifikation hinzugefügt (circa 2013). Daher wurde die Java EE-Annotation 8 Jahre später als das Spring-Gegenstück hinzugefügt.Das Java EE
@Transactional
definiert nur 3 Attribute:dontRollbackOn
: Die Liste der Java-Exception
Klassen, die ausgelöst werden können, ohne dass ein Transaktions-Rollback ausgelöst wirdrollbackOn
: Die Liste der Java-Exception
Klassen, die beim Auslösen einen Transaktions-Rollback auslösenvalue
: die von derTxType
Enum vorgegebene Ausbreitungsstrategie . Zum Beispiel, wenn der Transaktionskontext vererbt werden kann (z. B.REQUIRED
) oder ein neuer Transaktionskontext erstellt werden soll (z. B.REQUIRES_NEW
) oder wenn eine Ausnahme ausgelöst werden soll, wenn kein Transaktionskontext vorhanden ist (z. B.MANDATORY
) oder wenn eine Ausnahme ausgelöst werden soll wenn ein aktueller Transaktionskontext gefunden wird (zNOT_SUPPORTED
. B. ).Welches soll ich wählen?
Wenn Sie Spring oder Spring Boot verwenden, verwenden Sie die Spring-
@Transactional
Annotation, da Sie damit mehr Attribute als die Java EE-@Transactional
Annotation konfigurieren können .Wenn Sie nur Java EE verwenden und Ihre Anwendung auf einem Java EE-Anwendungsserver bereitstellen, verwenden Sie die Annotation Java EE `` @ Transactional`.
quelle