Sobes.tech
Назад к вопросам
Junior — Middle
67

Будет ли запускаться новая транзакция при вызове метода b внутри метода a, аннотированного @Transactional?

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

Если метод a аннотирован @Transactional и внутри него вызывается метод b того же класса, то новая транзакция для b не будет создана. Это связано с тем, что Spring применяет прокси для управления транзакциями, и вызовы методов внутри одного класса не проходят через прокси, а значит, аннотация @Transactional на методе b не сработает.

Таким образом, при вызове b из a транзакция будет общей, той, что открыта для a.

Если нужно, чтобы метод b запускался в отдельной транзакции, вызов должен происходить извне через прокси, например, через другой бин или через внедрение самого себя с помощью @Autowired.

Пример:

@Service
public class MyService {

    @Transactional
    public void a() {
        // код в транзакции
        b(); // вызов внутри класса, не создаст новую транзакцию
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void b() {
        // код, который должен быть в новой транзакции
    }
}

В этом примере b() не запустится в новой транзакции при вызове из a(). Чтобы это исправить, нужно вызвать b() через прокси, например, через внедренный бин MyService.