Транзакционни анотации: Пролет срещу JTA

Устойчивост отгоре

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА

1. Общ преглед

В този урок ще обсъдим разликите между org.springframework.transaction.annotation.Transactional и javax.transaction.Transactional анотации .

Ще започнем с преглед на техните конфигурационни свойства. След това ще обсъдим към какви типове компоненти може да се приложи всеки и при какви обстоятелства можем да използваме един или друг.

2. Разлики в конфигурацията

Транзакционната анотация на Spring се предлага с допълнителна конфигурация в сравнение с аналога на JTA:

  • Изолация - Spring предлага изолация с обхват от транзакции чрез свойството isolation ; обаче в JTA тази функция е достъпна само на ниво връзка
  • Разпространение - достъпно и в двете библиотеки, чрез свойството за разпространение през Spring и свойството value в Java EE; Пролетта предлага вложен като допълнителен тип размножаване
  • Само за четене - достъпно само през пролетта чрез свойството readOnly
  • Време за изчакване - налично само през пролетта чрез свойството за изчакване
  • Отмяна - и двете анотации предлагат управление на отката; JTA предоставя свойствата rollbackOn и dontRollbackOn , докато Spring има rollbackFor и noRollbackFor , плюс две допълнителни свойства: rollbackForClassName и noRollbackForClassName

2.1. Пролет Транзакционното Анотация Configuration

Като пример, нека използваме и конфигурираме анотацията Spring Transactional на проста автомобилна услуга:

import org.springframework.transaction.annotation.Transactional; @Service @Transactional( isolation = Isolation.READ_COMMITTED, propagation = Propagation.SUPPORTS, readOnly = false, timeout = 30) public class CarService { @Autowired private CarRepository carRepository; @Transactional( rollbackFor = IllegalArgumentException.class, noRollbackFor = EntityExistsException.class, rollbackForClassName = "IllegalArgumentException", noRollbackForClassName = "EntityExistsException") public Car save(Car car) { return carRepository.save(car); } }

2.3. JTA Транзакционното Анотация Configuration

Нека направим същото за проста услуга под наем, използвайки анотацията на JTA Transactional :

import javax.transaction.Transactional; @Service @Transactional(Transactional.TxType.SUPPORTS) public class RentalService { @Autowired private CarRepository carRepository; @Transactional( rollbackOn = IllegalArgumentException.class, dontRollbackOn = EntityExistsException.class) public Car rent(Car car) { return carRepository.save(car); } }

3. Приложимост и взаимозаменяемост

JTA транзакционната анотация се отнася за управлявани от CDI зърна и класове, дефинирани като управляеми зърна от спецификацията Java EE, докато анотацията Transactional за Spring се отнася само за пролетните зърна.

Също така си струва да се отбележи, че поддръжката за JTA 1.2 е въведена в Spring Framework 4.0. По този начин можем да използваме JTA Transactional анотация в пролетни приложения . Обратното обаче не е възможно, тъй като не можем да използваме анотации Spring извън контекста Spring.

4. Заключение

В този урок обсъдихме разликите между транзакционните анотации от Spring и JTA и кога можем да използваме едно или друго.

Както винаги, кодът от този урок е достъпен в GitHub.

Устойчивост отдолу

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА