Декларативный объем транзакции
И @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`.
Подробнее о том, как конфигурация уровня изоляции отличается при использовании определений Spring или Java EE @Transactional
, читайте в этой статье .
javax.transaction.Transactional
так что теперь его можно использовать и в приложениях Spring без каких-либо дополнительных действий. IMO, это было довольно плохое решение с точки зрения дизайна , потому что из моего опыта многие разработчики неосознанно путают эти два в своем коде, что впоследствии приводит к проблемам.