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 .