Sobes.tech
Junior — Middle
120

Spring'de aynı işlem alanındaki başka bir yöntemde @Transactional anotasyonu ile işaretlenmiş bir yöntemi çağırırken kaç tane işlem olduğunu nasıl sayarsınız?

Sorulan şirketler
Северсталь-ИфокомСеверсталь-Ифоком

AI'dan gelen yanıt

sobes.tech yapay zeka

В 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();
    }
}

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