Ответ
Нет, не распространяется. Spring AOP создает прокси-объекты для управления транзакциями. Вызов метода другого бина происходит через его прокси, минуя транзакционный контекст вызывающего метода.
Пример:
@Service
class ServiceA {
@Transactional
public void methodA() {
// Этот вызов НЕ будет частью транзакции methodA
serviceB.methodB();
}
}
@Service
class ServiceB {
// Без собственной @Transactional выполнится auto-commit
public void methodB() {
// Операции с БД
}
}
Почему так происходит? Spring внедряет транзакционность через прокси, который перехватывает вызовы извне. Внутренние вызовы между бинами не перехватываются.
Решение:
- Добавить
@Transactionalна метод B. - Использовать самовызов в одном классе (только если оба метода в одном бине):
@Service class ServiceA { @Transactional public void methodA() { this.methodB(); // Будет в одной транзакции (режим прокси) } public void methodB() { /* ... */ } }Примечание: для самовызовов может потребоваться режим
AspectJвместо стандартного прокси.