Назад к вопросам
Senior
6
Задача по коду: Spring @Transactional и self-invocation (скриншот с кодом)
Компании, где спрашивали
Позитив Технолоджис
Ответ от нейросети
sobes.tech AI
В Spring аннотация @Transactional работает через прокси, которые перехватывают вызовы методов и управляют транзакциями. При self-invocation (вызове транзакционного метода из другого метода того же класса напрямую) прокси не срабатывает, и транзакция не начинается.
Это происходит потому, что вызов идет не через прокси, а напрямую по this, и Spring не может применить транзакционный аспект.
Чтобы обойти эту проблему, можно:
- Вынести транзакционный метод в отдельный бин и вызывать его через внедренный сервис.
- Использовать AopContext.currentProxy() для получения прокси и вызова метода через него.
Пример:
@Service
public class MyService {
@Transactional
public void transactionalMethod() {
// код в транзакции
}
public void caller() {
((MyService) AopContext.currentProxy()).transactionalMethod();
}
}
И не забыть включить exposeProxy = true в конфигурации Spring.