Я не понимаю, какова реальная разница между аннотациями javax.transaction.Transactional
и org.springframework.transaction.annotation.Transactional
?
Является org.springframework.transaction.annotation.Transactional
ли расширение javax.transaction.Transactional
или они имеют совершенно другое значение? Когда следует использовать каждый из них? Весна @Transactinal
в сервисном слое и javax в DAO?
Спасибо за ответы.
javax.transaction.Transactional
так что теперь его можно использовать и в приложениях Spring без каких-либо дополнительных действий. IMO, это было довольно плохое решение с точки зрения дизайна , потому что из моего опыта многие разработчики неосознанно путают эти два в своем коде, что впоследствии приводит к проблемам.org.springframework.transaction.annotation.Transactional
предлагает больше вариантов (какreadOnly
, напримерtimeout
), чемjavax.transaction.Transactional
Другое отличие заключается в том, как Spring обрабатывает аннотации @Transactional.
javax.ejb.TransactionAttribute
в пути к классам (с версии 2.5.3 до 3.2.5). Таким образом, вы можете получить аннотации, которые не будут приняты во внимание, если только ониjavax.transaction.Transactional
находятся в вашем пути к классам, а не нетjavax.ejb.TransactionAttribute
. Это может быть в случае, если вы работаете с Hibernate: hibernate-core (4.3.7.Final) зависит от jboss -action-api_1.2_spec (1.0.0.Final), который не предоставляетjavax.ejb.TransactionAttribute
.источник
Пожалуйста, будьте осторожны, (эта проблема произошла в tomcat),
Если ваше приложение является веб-приложением SPRING и вы используете механизм обработки транзакций Spring
@org.springframework.transaction.annotation.Transactional
, то не смешивайте его с javax.transaction.Transactional.То есть всегда используйте,
@org.springframework.transaction.annotation.Transactional
в приложении весны последовательно.В противном случае мы можем получить эту ошибку,
источник
Декларативный объем транзакции
И
@Transaction
аннотация Spring, и JPA позволяют вам определить область действия данной транзакции приложения.Таким образом, если метод службы помечен
@Transactional
аннотацией, он будет выполняться в транзакционном контексте. Если метод обслуживания использует несколько DAO или репозиториев, все операции чтения и записи рекламы будут выполняться в одной и той же транзакции базы данных.весна
@Transactional
org.springframework.transaction.annotation.Transactional
Аннотаций доступен с версии рамок Spring 1.2 (ок 2005), и это позволяет установить следующие транзакционные свойства:isolation
: базовый уровень изоляции базы данныхnoRollbackFor
иnoRollbackForClassName
: списокException
классов Java, которые могут быть запущены без запуска отката транзакцииrollbackFor
иrollbackForClassName
: списокException
классов Java, которые вызывают откат транзакции при выдачеpropagation
: тип распространения транзакции, заданныйPropagation
Enum. Например, если контекст транзакции может быть унаследован (например,REQUIRED
) или должен быть создан новый контекст транзакции (например,REQUIRES_NEW
), или если должно быть выброшено исключение, если контекст транзакции отсутствует (например,MANDATORY
), или если должно быть выброшено исключение если найден текущий контекст транзакции (например,NOT_SUPPORTED
).readOnly
: должна ли текущая транзакция только читать данные без применения каких-либо изменений.timeout
: сколько секунд должен быть разрешен контекст транзакции, пока не будет выдано исключение тайм-аута.value
илиtransactionManager
: имяTransactionManager
bean-компонента Spring, который будет использоваться при привязке контекста транзакции.Java EE
@Transactional
javax.transaction.Transactional
Аннотаций была добавлена в спецификации Java EE 7 (около 2013 года ). Итак, аннотация Java EE была добавлена через 8 лет, что и ее аналог Spring.Java EE
@Transactional
определяет только 3 атрибута:dontRollbackOn
: списокException
классов Java, которые могут быть запущены без запуска отката транзакцииrollbackOn
: списокException
классов Java, которые вызывают откат транзакции при выдачеvalue
: стратегия распространения, даннаяTxType
Enum. Например, если контекст транзакции может быть унаследован (например,REQUIRED
) или должен быть создан новый контекст транзакции (например,REQUIRES_NEW
), или если должно быть выброшено исключение, если контекст транзакции отсутствует (например,MANDATORY
), или если должно быть выброшено исключение если найден текущий контекст транзакции (например,NOT_SUPPORTED
).Какой выбрать?
Если вы используете Spring или Spring Boot, используйте
@Transactional
аннотацию Spring , поскольку она позволяет настроить больше атрибутов, чем@Transactional
аннотация Java EE .Если вы используете только Java EE и развертываете свое приложение на сервере приложений Java EE, используйте аннотацию Java EE `` @ Transactional`.
источник