Hoe tel je het aantal transactionele operaties wanneer je een met @Transactional geannoteerde methode aanroept binnen een andere methode in hetzelfde transactionele gebied in Spring?
Antwoord van 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();
}
}
Таким образом, если метод вызывается внутри уже активной транзакции, счетчик не увеличится, так как новая транзакция не создается. Если же транзакция новая, счетчик увеличится. Это позволит понять, сколько транзакций реально стартовало при вызове методов.