Sobes.tech
Junior — Middle

@Transactional ile işaretlenmiş a metodunun içinde b metodunu çağırırken yeni bir işlem başlatılacak mı?

sobes.tech yapay zeka

AI'dan gelen yanıt

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

Таким образом, при вызове b из a транзакция будет общей, той, что открыта для a.

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

Пример:

@Service
public class MyService {

    @Transactional
    public void a() {
        // код в транзакции
        b(); // вызов внутри класса, не создаст новую транзакцию
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void b() {
        // код, который должен быть в новой транзакции
    }
}

В этом примере b() не запустится в новой транзакции при вызове из a(). Чтобы это исправить, нужно вызвать b() через прокси, например, через внедренный бин MyService.