Comment compter le nombre d'opérations transactionnelles lors de l'appel d'une méthode annotée @Transactional à l'intérieur d'une autre méthode dans le même contexte transactionnel en Spring?
Réponse de l'IA
sobes.tech IA
В 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();
}
}
Таким образом, если метод вызывается внутри уже активной транзакции, счетчик не увеличится, так как новая транзакция не создается. Если же транзакция новая, счетчик увеличится. Это позволит понять, сколько транзакций реально стартовало при вызове методов.