Как подсчитать количество транзакционных операций при вызове одного метода с аннотацией @Transactional внутри другого метода той же транзакционной области в Spring?
Ответ от нейросети
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();
}
}
Таким образом, если метод вызывается внутри уже активной транзакции, счетчик не увеличится, так как новая транзакция не создается. Если же транзакция новая, счетчик увеличится. Это позволит понять, сколько транзакций реально стартовало при вызове методов.