Não entendo qual é a diferença real entre anotações javax.transaction.Transactional
e org.springframework.transaction.annotation.Transactional
?
É org.springframework.transaction.annotation.Transactional
uma extensão javax.transaction.Transactional
ou eles têm um significado totalmente diferente? Quando cada um deles deve ser usado? Primavera @Transactinal
na camada de serviço e javax no DAO?
Obrigado por responder.
javax.transaction.Transactional
que agora você pudesse usá-lo também em aplicativos Spring sem nenhuma ação adicional. Na IMO, essa foi uma péssima decisão do ponto de vista do design , porque, pela minha experiência, muitos desenvolvedores confundem inconscientemente esses dois em seu código, o que gera problemas posteriormente.org.springframework.transaction.annotation.Transactional
oferece mais opções (comoreadOnly
,timeout
) quejavax.transaction.Transactional
Outra diferença é como o Spring lida com as anotações @Transactional
javax.ejb.TransactionAttribute
está disponível no caminho de classe (da versão 2.5.3 a 3.2.5). Assim, você pode terminar com suas anotações não sendo levadas em consideração sejavax.transaction.Transactional
estiver apenas no seu caminho de classe e nãojavax.ejb.TransactionAttribute
. Este pode ser o caso se você estiver trabalhando com o Hibernate: hibernate-core (4.3.7.Final) depende do jboss-transaction-api_1.2_spec (1.0.0.Final), que não fornecejavax.ejb.TransactionAttribute
.fonte
Tenha cuidado, (esse problema ocorreu no tomcat),
Se o seu aplicativo for um aplicativo da Web SPRING e você estiver usando o mecanismo de manipulação de transações do Spring
@org.springframework.transaction.annotation.Transactional
, não misture com javax.transaction.Transactional.Isso é sempre usar,
@org.springframework.transaction.annotation.Transactional
em uma aplicação de mola de forma consistente.Caso contrário, podemos acabar com este erro,
fonte
Escopo da transação declarativa
As
@Transaction
anotações Spring e JPA permitem definir o escopo de uma determinada transação de aplicativo.Portanto, se um método de serviço for anotado com a
@Transactional
anotação, ele será executado em um contexto transacional. Se o método de serviço usar vários DAO ou Repositórios, todas as operações de gravação e gravação de anúncios serão executadas na mesma transação do banco de dados.Primavera
@Transactional
A
org.springframework.transaction.annotation.Transactional
anotação está disponível desde a versão 1.2 da estrutura Spring (por volta de 2005) e permite definir as seguintes propriedades transacionais:isolation
: o nível de isolamento do banco de dados subjacentenoRollbackFor
enoRollbackForClassName
: a lista deException
classes Java que podem ser acionadas sem acionar uma reversão de transaçãorollbackFor
erollbackForClassName
: a lista deException
classes Java que acionam uma reversão de transação ao serem lançadaspropagation
: o tipo de propagação da transação fornecido peloPropagation
Enum. Por exemplo, se o contexto da transação pode ser herdado (por exemplo,REQUIRED
) ou um novo contexto de transação deve ser criado (por exemplo,REQUIRES_NEW
) ou se uma exceção deve ser lançada se nenhum contexto de transação estiver presente (por exemplo,MANDATORY
) ou se uma exceção deve ser lançada se um contexto de transação atual for encontrado (por exemplo,NOT_SUPPORTED
).readOnly
: se a transação atual deve apenas ler os dados sem aplicar nenhuma alteração.timeout
: quantos segundos o contexto da transação deve ser executado até que uma exceção de tempo limite seja lançada.value
outransactionManager
: o nome doTransactionManager
bean Spring a ser usado ao vincular o contexto da transação.Java EE
@Transactional
A
javax.transaction.Transactional
anotação foi adicionada pela especificação Java EE 7 (por volta de 2013). Portanto, a anotação Java EE foi adicionada 8 anos depois à sua contraparte Spring.O Java EE
@Transactional
define apenas três atributos:dontRollbackOn
: a lista deException
classes Java que podem ser acionadas sem acionar uma reversão de transaçãorollbackOn
: a lista deException
classes Java que acionam uma reversão de transação ao serem lançadasvalue
: a estratégia de propagação, dada peloTxType
Enum. Por exemplo, se o contexto da transação pode ser herdado (por exemplo,REQUIRED
) ou um novo contexto de transação deve ser criado (por exemplo,REQUIRES_NEW
) ou se uma exceção deve ser lançada se nenhum contexto de transação estiver presente (por exemplo,MANDATORY
) ou se uma exceção deve ser lançada se um contexto de transação atual for encontrado (por exemplo,NOT_SUPPORTED
).Qual escolher?
Se você estiver usando Spring ou Spring Boot, use a
@Transactional
anotação Spring , pois ela permite configurar mais atributos que a@Transactional
anotação Java EE .Se você estiver usando o Java EE sozinho e implantar seu aplicativo em um servidor de aplicativos Java EE, use a anotação `` @ Transactional` do Java EE.
fonte