Как се държи системата, ако вътре в транзакционен метод се извиква друг метод, също маркиран с транзакционна анотация?
sobes.tech AI
Отговор от AI
В Java, при използване на транзакции (например с анотацията @Transactional в Spring), поведението при извикване на друга метод, също маркиран като транзакционен, зависи от типа на прокси и настройките на транзакциите.
По подразбиране, ако извикването става вътре в същия клас (вътрешно извикване на метод), прокси не го прихваща и не се създава нова транзакция — използва се текущата транзакция (ако има такава).
Ако извикването идва отвън (чрез прокси), тогава:
- При propagation тип
REQUIRED(по подразбиране), вътрешна транзакция не се създава, използва се съществуващата. - При propagation
REQUIRES_NEW, се създава нова транзакция, като текущата се спира.
Така, при извикване на транзакционен метод от друг транзакционен метод в същия клас, обикновено се използва една и съща транзакция, и вложената анотация не създава нова транзакция.
Ако искате вътрешният метод да се изпълнява в отделна транзакция, извикването трябва да става чрез прокси (например, чрез друг бийн или чрез self-injection).