Рубрики
Без рубрики

Аннотации транзакций: Spring против JTA

Быстрое и практичное сравнение различных аннотаций @Transactional.

Автор оригинала: baeldung.

1. Обзор

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

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

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

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

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

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

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

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 Транзакционную аннотацию:

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, в то время как Транзакционная аннотация Spring применяется только к компонентам Spring.

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

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

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

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