Будет ли запускаться новая транзакция при вызове метода 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.