JpaTransactionManager 支持 REQUIRES_NEW 传播吗?

问题描述 投票:0回答:1

在我的 springboot 应用程序中,我有一个带有嵌套事务的方法,如下所示。

//message handler
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    @Override
    public void processMessage(MessageDto messageDto) {
            // some code here that throws exception and marks transaction as rollback-only
            someService.setMessageStatus(messageDto, SUCCESS);
        } catch (Exception e) {
            messageDto.setException(e);
            someService.setMessageStatus(messageDto, ERROR);
        }
    }
...
//someService
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    @Override
    public void setMessageStatus(MessageDto messageDto, StatusEnum status) {
        MessageEntity messageEntity = messageRepository.getById(messageDto.getId());
        messageEntity.setStatus(status);
        messageEntity.setError(messageDto.getException().getMessage());
    }

即使我将所有方法设置为

@Transactional(propagation = Propagation.REQUIRES_NEW)
,在捕获异常后尝试设置ERROR状态时,我也会得到UnexpectedRollbackException

org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only

文档说并非所有事务管理器都受支持

注意:实际的事务暂停不会在所有事务管理器上开箱即用。这尤其适用于 JtaTransactionManager,它需要 javax.transaction.TransactionManager 可供其使用(这是标准 J2EE 中特定于服务器的)。

这就是我创建事务管理器的方式:

    @Bean
    public PlatformTransactionManager transactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
        return transactionManager;
    }

无论事先发生什么异常,我都想保留错误状态。

所以我的问题是如何让 UnexpectedRollbackException 消失?

难道

JpaTransactionManager
不支持REQUIRES_NEW选项?

java spring rollback transactionmanager
1个回答
0
投票

不幸的是,JpaTransactionManager 不支持 REQUIRES_NEW 选项:

https://www.baeldung.com/spring-transactional-propagation-isolation

© www.soinside.com 2019 - 2024. All rights reserved.