Перейти к основному содержимому

Транзакционные аннотации: Spring против JTA

· 2 мин. чтения

1. Обзор

В этом руководстве мы обсудим различия между аннотациями org.springframework.transaction.annotation.Transactional и javax.transaction.Transactional .

Мы начнем с обзора их свойств конфигурации. Затем мы обсудим, к каким типам компонентов можно применить каждый из них и в каких обстоятельствах мы можем использовать тот или иной компонент.

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

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

  • Изоляция — Spring предлагает изоляцию на уровне транзакции с помощью свойства изоляции ; однако в JTA эта функция доступна только на уровне соединения
  • Распространение — доступно в обеих библиотеках через свойство распространения в Spring и свойство value в Java EE; Spring предлагает Nested в качестве дополнительного типа распространения.
  • Только для чтения — доступно только в Spring через свойство readOnly.
  • Тайм-аут — доступен только в Spring через свойство тайм -аута.
  • Откат — обе аннотации предлагают управление откатом; JTA предоставляет свойства rollbackOn и dontRollbackOn , в то время как Spring имеет rollbackFor и noRollbackFor , а также два дополнительных свойства: rollbackForClassName и noRollbackForClassName.

2.1. Конфигурация транзакционных аннотаций Spring

В качестве примера воспользуемся и настроим аннотацию 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

Сделаем то же самое для простого сервиса аренды, используя аннотацию 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 Transactional применяется к управляемым CDI bean-компонентам и классам, определенным как управляемые bean-компоненты в спецификации Java EE, тогда как аннотация Spring Transactional применяется только к bean-компонентам Spring.

Также стоит отметить, что поддержка JTA 1.2 появилась в Spring Framework 4.0. Таким образом, мы можем использовать аннотацию JTA Transactional в приложениях Spring . Однако обратное невозможно, поскольку мы не можем использовать аннотации Spring вне контекста Spring.

4. Вывод

В этом руководстве мы обсудили различия между транзакционными аннотациями из Spring и JTA, а также когда мы можем использовать ту или иную.

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