@Transactional реализован как прокси-сервер AOP, обертывающий компонент; прокси-сервер перехватывает только вызовы, поступающие извне, через ссылку на прокси. this.method() — это простой вызов Java, который никогда не затрагивает прокси-сервер, поэтому транзакция не открывается — исправление заключается в вызове через отдельный компонент.
Пример
@ServicepublicclassOrderService {
@TransactionalpublicvoidplaceOrder(Order order) {
orderRepository.save(order);
inventoryService.reserve(order); // participates in the same transaction
}
publicvoidplaceOrderBatch(List orders) {
for (Order order : orders) {
this.placeOrder(order); // @Transactional is silently ignored here!
}
}
}
Итог
@Transactional реализован как прокси-сервер AOP, обертывающий компонент; прокси-сервер перехватывает только вызовы, поступающие извне, через ссылку на прокси.
Почему вызов метода @Transactional через this.method() изнутри того… · Sobeso