Декларативний обсяг угоди
Як @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: назва Spring TransactionManagerBean, що використовується для прив'язки контексту транзакції.
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Енумом. Наприклад, якщо контекст транзакції може бути успадкований (наприклад, 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 без додаткових дій. ІМО, це було досить поганим рішенням з точки зору дизайну , тому що, з мого досвіду, багато розробників не свідомо плутають цих двох у своєму коді, що призводить до проблем згодом.