Sobes.tech
Junior — Middle

Τι συμβαίνει με τη συναλλαγή αν μέσα σε μια μέθοδο που έχει σημειωθεί με @Transactional καλείται άλλη μέθοδος της ίδιας κλάσης, επίσης με @Transactional;

sobes.tech AI

Απάντηση από AI

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

Это происходит потому, что Spring использует прокси для управления транзакциями, и вызовы методов внутри одного класса обходят прокси, вызывая методы напрямую. В результате аннотация @Transactional второго метода игнорируется, и вся логика выполняется в рамках одной транзакции, открытой внешним методом.

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

Пример:

@Service
public class MyService {

    @Transactional
    public void outerMethod() {
        // транзакция открыта
        innerMethod(); // вызов напрямую, аннотация @Transactional игнорируется
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void innerMethod() {
        // не откроется новая транзакция при прямом вызове
    }
}