Встречается на собеседованиях • сегодня

Откроется ли новая транзакция, если в одном сервисе из одного транзакционного метода вызвать другой

Если метод вызывается внутри одного класса (даже если он помечен @Transactional), Spring по умолчанию использует proxy-based AOP, поэтому транзакция не будет открываться заново — вызов произойдет в рамках существующей транзакции. Это поведение можно изменить через @Transactional(propagation = Propagation.REQUIRES_NEW).

Пример:

java
@Service
public class MyService {
    @Transactional
    public void methodA() {
        methodB(); // Будет в той же транзакции!
    }

    @Transactional
    public void methodB() {
        // Логика
    }
}

Для создания новой транзакции нужно:

  1. Вынести метод в отдельный сервис
  2. Или использовать self-injection и вызывать через него:
java
@Autowired
private MyService self;

@Transactional
public void methodA() {
    self.methodB(); // Теперь откроется новая транзакция
}
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы