Sobes.tech
Junior — Middle
121

Spring-де бір транзакциялық аймақтағы басқа әдістің ішінде @Transactional аннотациясымен белгіленген бір әдісті шақыру кезінде транзакциялық операциялардың санын қалай есептеуге болады?

Сұралған компаниялар
Северсталь-ИфокомСеверсталь-Ифоком

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

Осылайша, егер әдіс бұрыннан белсенді транзакция ішінде шақырылса, есептегіш өсірілмейді, себебі жаңа транзакция құрылады. Егер жаңа транзакция болса, есептегіш өседі. Бұл әдіс шақырылған кезде қанша транзакция нақты басталғанын түсінуге көмектеседі.