Проверяет понимание механизма проксирования транзакций в Spring и причин, по которым внутренний вызов метода не создает новую транзакцию.
В Spring управление транзакциями реализовано с помощью AOP (аспектно-ориентированного программирования). Когда вы помечаете метод аннотацией @Transactional, Spring создает прокси-объект вокруг вашего бина. Этот прокси перехватывает вызовы методов и добавляет логику открытия, фиксации или отката транзакции.
Проблема возникает при вызове одного @Transactional метода из другого метода того же класса. Такой вызов называется self-invocation. В этом случае вызов происходит напрямую через ссылку this, минуя прокси. Прокси не участвует, и транзакционная логика не применяется.
@Service
public class UserService {
@Transactional
public void outerMethod() {
// Этот вызов не создаст новую транзакцию
innerMethod();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void innerMethod() {
// Логика, которая должна быть в отдельной транзакции
}
}В этом примере innerMethod() будет выполняться в той же транзакции, что и outerMethod(), несмотря на REQUIRES_NEW. Прокси не перехватывает вызов, поэтому новая транзакция не создается.
@Autowired и вызывать методы через нее.AopContext.currentProxy() — получить текущий прокси и вызвать метод через него (требует @EnableAspectJAutoProxy(exposeProxy = true)).Понимание механизма проксирования критично для корректной работы транзакций в Spring. Self-invocation — частая ошибка, которую легко избежать, вынося транзакционные методы в отдельные сервисы или используя самовнедрение. Это знание помогает писать надежный код с предсказуемым поведением транзакций.
Уровень
Рейтинг:
4
Сложность:
5
Навыки
Node.js
Spring
Ключевые слова
Подпишись на Java Developer в телеграм