首页 > 解决方案 > 在@Recover 方法上使用@Transaction 时出现异常

问题描述

我正在尝试为我的数据库操作实现@Retryable和功能。@Recover

请参阅下面我的示例代码

@Retryable(value = {PriceUploadServiceException.class,RuntimeException.class}, maxAttempts = 3, backoff = @Backoff(10000))
@Transactional(value ="phoenixTxManager", propagation =Propagation.REQUIRED, rollbackForClassName ="PriceUploadServiceException")
public void insertUploadedData(UploadInsertReqDTO uploadInsertReq)
{
    //Doing some insertion and update operation
}
        
@Modifying
@Transactional(value ="phoenixTxManager", propagation =Propagation.REQUIRED, rollbackForClassName ="PriceUploadServiceException")
@Recover    
public void updatefailureStatus(RuntimeException ex,UploadInsertReqDTO uploadInsertReq)
{
    //Doing some delete operation, If all the retry attempts got failed
    logger.info("All Retry fails So Recover Invoked : "+uploadInsertReq.getSeqId());
                
    Optional<AsyncProcessEntity> optAsync = asyncProcessRepo.findById(uploadInsertReq.getSeqId());
    if(optAsync.isPresent()) 
    {                
         AsyncProcessEntity asynObj = optAsync.get();
         asyncProcessRepo.deleteById(asynObj.getAsyncProcessSeqId());
         asynObj.setProcessStatus(AppConstants.FAILED);
         phenixtEntityManager.persist(asynObj);
         phenixtEntityManager.flush();
    }
}

我已经在我的代码中尝试了上述逻辑,重试尝试工作正常,但是当我在@Recover方法中删除并插入记录时,我遇到了异常。即使我删除@Transactional@Recover方法

    javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call
        at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:298)
        at com.sun.proxy.$Proxy193.persist(Unknown Source)
        at com.tcs.opt.priceupload.service.PriceUploadService.updatefailureStatus(PriceUploadService.java:339)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282)
        at org.springframework.retry.annotation.RecoverAnnotationRecoveryHandler.recover(RecoverAnnotationRecoveryHandler.java:73)
        at org.springframework.retry.interceptor.RetryOperationsInterceptor$ItemRecovererCallback.recover(RetryOperationsInterceptor.java:141)
        at org.springframework.retry.support.RetryTemplate.handleRetryExhausted(RetryTemplate.java:512)
        at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:351)
        at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:180)
        at org.springframework.retry.interceptor.RetryOperationsInterceptor.invoke(RetryOperationsInterceptor.java:115)

请帮我解决这个问题,或者告诉我任何其他解决方案来实现这个功能。

标签: javaspring-bootspring-data-jpaspring-transactionsspring-retry

解决方案


推荐阅读