Sobes.tech
Junior — Middle

Как се държи системата, ако вътре в транзакционен метод се извиква друг метод, също маркиран с транзакционна анотация?

sobes.tech AI

Отговор от AI

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

По подразбиране, ако извикването става вътре в същия клас (вътрешно извикване на метод), прокси не го прихваща и не се създава нова транзакция — използва се текущата транзакция (ако има такава).

Ако извикването идва отвън (чрез прокси), тогава:

  • При propagation тип REQUIRED (по подразбиране), вътрешна транзакция не се създава, използва се съществуващата.
  • При propagation REQUIRES_NEW, се създава нова транзакция, като текущата се спира.

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

Ако искате вътрешният метод да се изпълнява в отделна транзакция, извикването трябва да става чрез прокси (например, чрез друг бийн или чрез self-injection).