Je ne comprends pas quelle est la différence réelle entre les annotations javax.transaction.Transactional
et org.springframework.transaction.annotation.Transactional
?
Est-ce org.springframework.transaction.annotation.Transactional
une extension de javax.transaction.Transactional
ou ont-ils une signification totalement différente? Quand faut-il utiliser chacun d'eux? Spring @Transactinal
dans la couche de service et javax dans DAO?
Merci de répondre.
javax.transaction.Transactional
que l'on puisse désormais l'utiliser également dans les applications Spring sans aucune action supplémentaire. OMI, c'était une très mauvaise décision du point de vue de la conception , car d'après mon expérience, beaucoup de développeurs confondent inconsciemment ces deux dans leur code, ce qui entraîne des problèmes par la suite.org.springframework.transaction.annotation.Transactional
offre plus d'options (commereadOnly
,timeout
) quejavax.transaction.Transactional
Une autre différence est la façon dont Spring gère les annotations @Transactional
javax.ejb.TransactionAttribute
est disponible dans le chemin des classes (de la version 2.5.3 à 3.2.5). Ainsi, vous pouvez vous retrouver avec vos annotations non prises en compte si ce n'est quejavax.transaction.Transactional
dans votre chemin de classe et nonjavax.ejb.TransactionAttribute
. Cela peut être le cas si vous travaillez avec Hibernate: hibernate-core (4.3.7.Final) dépend de jboss-transaction-api_1.2_spec (1.0.0.Final), qui ne fournit pasjavax.ejb.TransactionAttribute
.la source
Veuillez faire attention, (ce problème est survenu dans tomcat),
Si votre application est une application Web SPRING et que vous utilisez le mécanisme de gestion des transactions de Spring
@org.springframework.transaction.annotation.Transactional
, ne le mélangez pas avec javax.transaction.Transactional.C'est toujours utiliser,
@org.springframework.transaction.annotation.Transactional
dans une application de printemps de manière cohérente.Sinon, nous pouvons nous retrouver avec cette erreur,
la source
Périmètre de transaction déclarative
Les
@Transaction
annotations Spring et JPA vous permettent de définir la portée d'une transaction d'application donnée.Ainsi, si une méthode de service est annotée avec le
@Transactional
annotation, elle s'exécutera dans un contexte transactionnel. Si la méthode de service utilise plusieurs DAO ou référentiels, toutes les opérations de lecture et d'écriture seront exécutées dans la même transaction de base de données.Printemps
@Transactional
L'
org.springframework.transaction.annotation.Transactional
annotation est disponible depuis la version 1.2 du framework Spring (vers 2005) et vous permet de définir les propriétés transactionnelles suivantes:isolation
: le niveau d'isolement de la base de données sous-jacentenoRollbackFor
etnoRollbackForClassName
: la liste desException
classes Java pouvant être déclenchées sans déclencher une annulation de transactionrollbackFor
etrollbackForClassName
: la liste desException
classes Java qui déclenchent une annulation de transaction lors de la levéepropagation
: le type de propagation de transaction donné parPropagation
Enum. Par exemple, si le contexte de transaction peut être hérité (par exemple,REQUIRED
) ou si un nouveau contexte de transaction doit être créé (par exemple,REQUIRES_NEW
) ou si une exception doit être levée si aucun contexte de transaction n'est présent (par exemple,MANDATORY
) ou si une exception doit être levée si un contexte de transaction courant est trouvé (par exemple,NOT_SUPPORTED
).readOnly
: si la transaction en cours doit uniquement lire les données sans appliquer de modifications.timeout
: combien de secondes le contexte de transaction doit-il être autorisé à s'exécuter jusqu'à ce qu'une exception de délai d'attente soit levée.value
outransactionManager
: le nom duTransactionManager
bean Spring à utiliser lors de la liaison du contexte de transaction.Java EE
@Transactional
L'
javax.transaction.Transactional
annotation a été ajoutée par la spécification Java EE 7 (vers 2013). Ainsi, l'annotation Java EE a été ajoutée 8 ans plus tard que son homologue Spring.Java EE ne
@Transactional
définit que 3 attributs:dontRollbackOn
: la liste desException
classes Java qui peuvent être déclenchées sans déclencher un rollback de transactionrollbackOn
: la liste desException
classes Java qui déclenchent un rollback de transaction lors de la levéevalue
: la stratégie de propagation, donnée parTxType
Enum. Par exemple, si le contexte de transaction peut être hérité (par exemple,REQUIRED
) ou si un nouveau contexte de transaction doit être créé (par exemple,REQUIRES_NEW
) ou si une exception doit être levée si aucun contexte de transaction n'est présent (par exemple,MANDATORY
) ou si une exception doit être levée si un contexte de transaction courant est trouvé (par exemple,NOT_SUPPORTED
).Lequel choisir?
Si vous utilisez Spring ou Spring Boot, utilisez l'
@Transactional
annotation Spring , car elle vous permet de configurer plus d'attributs que l'@Transactional
annotation Java EE .Si vous utilisez Java EE seul et que vous déployez votre application sur un serveur d'applications Java EE, utilisez l'annotation Java EE `` @ Transactional`.
la source