Sobes.tech
Junior — Middle

Jak zachowuje się system, jeśli wewnątrz metody oznaczonej jako transakcyjna wywoływana jest inna metoda również oznaczona adnotacją transakcyjną?

sobes.tech AI

Odpowiedź od AI

В Java, при использовании транзакций (например, с аннотацией @Transactional в Spring), если внутри транзакционного метода вызывается другой метод, также помеченный как транзакционный, поведение зависит от типа прокси и настроек транзакций.

По умолчанию, если вызов происходит внутри одного класса (внутренний вызов метода), то прокси не перехватывает этот вызов, и новая транзакция не создаётся — используется текущая транзакция (если она есть).

Если же вызов происходит извне (через прокси), то:

  • При propagation типа REQUIRED (по умолчанию) внутренняя транзакция не создаётся, используется существующая.
  • При propagation REQUIRES_NEW создаётся новая транзакция, приостанавливая текущую.

Таким образом, при вызове транзакционного метода из другого транзакционного метода в одном классе, как правило, используется одна и та же транзакция, и вложенная аннотация не создаёт новую транзакцию.

Если нужно, чтобы внутренний метод запускался в отдельной транзакции, вызов должен происходить через прокси (например, через другой бин или через self-инъекцию).