在我的 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选项?
不幸的是,JpaTransactionManager 不支持 REQUIRES_NEW 选项:
https://www.baeldung.com/spring-transactional-propagation-isolation