Sobes.tech
Junior — Middle
105

როგორ ითვლება ტრანზაქციური ოპერაციების რაოდენობა, როდესაც ერთ მეთოდს აქვს @Transactional ანოტაცია და ის იძახება სხვა მეთოდში იმავე ტრანზაქციურ სფეროში Spring-ში?

კომპანიებმა სადაც სთხოვეს
Северсталь-ИфокомСеверсталь-Ифоком

პასუხი AI-სგან

sobes.tech AI

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

Чтобы подсчитать количество транзакционных операций (например, сколько раз начинается новая транзакция), можно использовать:

  • Логирование транзакций через TransactionSynchronizationManager.
  • Внедрить кастомный PlatformTransactionManager или использовать AOP для подсчета начала транзакций.

Пример с использованием AOP для подсчета начала транзакций:

@Aspect
@Component
public class TransactionCounterAspect {
    private AtomicInteger transactionCount = new AtomicInteger(0);

    @Before("execution(@org.springframework.transaction.annotation.Transactional * *(..))")
    public void beforeTransactionalMethod() {
        if (!TransactionSynchronizationManager.isActualTransactionActive()) {
            transactionCount.incrementAndGet();
        }
    }

    public int getTransactionCount() {
        return transactionCount.get();
    }
}

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