Вопрос не является частным или публичным, вопрос в том, как он вызывается и какую реализацию AOP вы используете!
Если вы используете (по умолчанию) Spring Proxy AOP, то все функциональные возможности AOP, предоставляемые Spring (например @Transational
), будут приниматься во внимание, только если вызов проходит через прокси. - Обычно это так, если аннотированный метод вызывается из другого компонента.
Это имеет два значения:
- Поскольку закрытые методы не должны вызываться из другого компонента (исключение составляет отражение), их
@Transactional
аннотация не учитывается.
- Если метод общедоступен, но вызывается из того же компонента, он также не будет учитываться (это утверждение верно только в том случае, если используется (по умолчанию) Spring Proxy AOP).
@ См. Spring Reference: Глава 9.6 9.6 Механизмы прокси
ИМХО, вы должны использовать режим aspectJ вместо Spring Proxies, который решит проблему. А транзакционные аспекты AspectJ вплетены даже в приватные методы (проверено на Spring 3.0).
Ответ на ваш вопрос - нет - не
@Transactional
будет иметь никакого эффекта, если используется для аннотирования частных методов. Прокси-генератор будет игнорировать их.Это задокументировано в руководстве по весне, глава 10.5.6 :
источник
По умолчанию
@Transactional
атрибут работает только при вызове аннотированного метода для ссылки, полученной из applicationContext.Это откроет транзакцию:
Это не будет:
Spring Reference: Использование @Transactional
источник
Да, можно использовать @Transactional для частных методов, но, как уже упоминали другие, это не будет работать из коробки. Вам нужно использовать AspectJ. Мне потребовалось некоторое время, чтобы понять, как заставить это работать. Я поделюсь своими результатами.
Я решил использовать ткачество во время компиляции, а не ткачество во время загрузки, потому что я думаю, что это в целом лучший вариант. Кроме того, я использую Java 8, поэтому вам может потребоваться настроить некоторые параметры.
Сначала добавьте зависимость для aspectjrt.
Затем добавьте плагин AspectJ, чтобы выполнить фактическое переплетение байт-кода в Maven (это может быть не минимальным примером).
Наконец добавьте это в ваш класс конфигурации
Теперь вы должны иметь возможность использовать @Transactional для закрытых методов.
Одно предостережение об этом подходе: вам нужно будет сконфигурировать свою среду IDE, чтобы иметь представление об AspectJ, иначе, если вы запустите приложение, например, через Eclipse, оно может не работать. Удостоверьтесь, что вы проверяете против прямой сборки Maven как проверку работоспособности.
источник
Если вам нужно обернуть закрытый метод внутри транзакции и не хотите использовать aspectj, вы можете использовать TransactionTemplate .
источник
TransactionTemplate
использование, но, пожалуйста, вызовите этот второй метод,..RequiresTransaction
а не..InTransaction
. Всегда называйте материал так, как вы хотели бы прочитать его год спустя. Также я бы поспорил, если подумать, действительно ли он требует второго частного метода: либо поместить его содержимое непосредственно в анонимнуюexecute
реализацию, либо, если это станет грязным, это может указывать на разделение реализации на другой сервис, который вы затем сможете аннотировать@Transactional
.Весенние Документы объясняют это
Другим способом является пользователь BeanSelfAware
источник
BeanSelfAware
? Это не похоже на класс SpringОтвет - нет. Пожалуйста, смотрите Spring Reference: Использование @Transactional :
источник
Так же, как @loonis предложил использовать TransactionTemplate, можно использовать этот вспомогательный компонент (Kotlin):
Использование:
Не знаю,
TransactionTemplate
использовать повторно существующую транзакцию или нет, но этот код определенно делает.источник