Декларативный объем транзакции
И @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: тип распространения транзакции, заданный PropagationEnum. Например, если контекст транзакции может быть унаследован (например, REQUIRED) или должен быть создан новый контекст транзакции (например, REQUIRES_NEW), или если должно быть выброшено исключение, если контекст транзакции отсутствует (например, MANDATORY), или если должно быть выброшено исключение если найден текущий контекст транзакции (например, NOT_SUPPORTED).
readOnly: должна ли текущая транзакция только читать данные без применения каких-либо изменений.
timeout: сколько секунд должен быть разрешен контекст транзакции, пока не будет выдано исключение тайм-аута.
valueили transactionManager: имя TransactionManagerbean-компонента 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: стратегия распространения, данная TxTypeEnum. Например, если контекст транзакции может быть унаследован (например, REQUIRED) или должен быть создан новый контекст транзакции (например, REQUIRES_NEW), или если должно быть выброшено исключение, если контекст транзакции отсутствует (например, MANDATORY), или если должно быть выброшено исключение если найден текущий контекст транзакции (например, NOT_SUPPORTED).
Какой выбрать?
Если вы используете Spring или Spring Boot, используйте @Transactionalаннотацию Spring , поскольку она позволяет настроить больше атрибутов, чем @Transactionalаннотация Java EE .
Если вы используете только Java EE и развертываете свое приложение на сервере приложений Java EE, используйте аннотацию Java EE `` @ Transactional`.
Подробнее о том, как конфигурация уровня изоляции отличается при использовании определений Spring или Java EE @Transactional, читайте в этой статье .
javax.transaction.Transactionalтак что теперь его можно использовать и в приложениях Spring без каких-либо дополнительных действий. IMO, это было довольно плохое решение с точки зрения дизайна , потому что из моего опыта многие разработчики неосознанно путают эти два в своем коде, что впоследствии приводит к проблемам.