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