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 .