Ответ
Нет, не будет. Spring управляет транзакциями через AOP-прокси (или AspectJ). Прокси могут перехватывать вызовы только публичных методов.
Почему это не работает:
- Ограничение прокси: Spring создает прокси вокруг класса. Вызов приватного метода происходит напрямую, минуя прокси, поэтому аспект транзакционности не применяется.
- Принцип ООП: Приватные методы не видны извне класса, включая прокси-объект.
Некорректный пример:
@Service
public class TransactionService {
@Transactional // НЕ БУДЕТ РАБОТАТЬ
private void updateData() {
// Логика с доступом к БД
}
public void publicMethod() {
updateData(); // Вызов приватного метода -> транзакции НЕТ
}
}
Решение:
- Делайте методы с
@Transactionalкак минимум package-visible (уровень доступа по умолчанию) или public. - Выносите транзакционную логику в отдельный публичный метод.
- Используйте режим
mode = AdviceMode.ASPECTJдля weaving'а на уровне байт-кода (позволяет обойти ограничение, но требует дополнительной настройки).
Вывод: @Transactional применима только к методам с видимостью, позволяющей перехват вызова через прокси.