Spring

Что произойдет, если один метод БЕЗ @Transactional вызовет другой метод с @Transactional?


Если один метод без аннотации @Transactional вызывает другой метод с аннотацией @Transactional, то внутренний метод будет выполняться без транзакционного контекста. При вызове внутреннего метода без аннотации @Transactional, Spring не будет создавать новую транзакцию для этого метода. Вместо этого, внутренний метод будет выполняться в рамках текущего контекста транзакции, если он существует, или без транзакционного контекста, если текущий метод не находится внутри транзакции. Пример: @Service public class MyService { @Autowired private MyRepository myRepository; public void outerMethod() { // Логика внешнего метода innerMethod(); } @Transactional public void innerMethod() { // Логика внутреннего метода myRepository.save(entity); } } В этом примере внешний метод, outerMethod(), не имеет аннотации @Transactional, в то время как внутренний метод, innerMethod(), помечен аннотацией @Transactional. При вызове outerMethod() внутренний метод будет выполняться без создания новой транзакции, и его выполнение будет зависеть от текущего контекста транзакции. Если внешний метод находится внутри транзакции, то внутренний метод будет выполняться в рамках этой транзакции. Если внешний метод не находится внутри транзакции, то внутренний метод будет выполняться без транзакционного контекста. Важно отметить, что при вызове внутреннего метода с аннотацией @Transactional внутри внешнего метода без аннотации @Transactional, транзакционные атрибуты, такие как уровень изоляции и поведение отката, не будут применяться к внутреннему методу.


Копировать ссылку