@Transactional 注释 rollbackFor 值在 Spring Boot 中不起作用

Posted

技术标签:

【中文标题】@Transactional 注释 rollbackFor 值在 Spring Boot 中不起作用【英文标题】:@Transactional annotation rollbackFor values does not working in spring boot 【发布时间】:2020-12-11 10:47:21 【问题描述】:

我在服务层方法过程中测试@Transactional回滚。

在我的代码下面。

@Transactional(rollbackFor = UnsupportedOperationException.class)
public RetryHistory failedOnCreateContainer() 
    final Container container = new Container();

    try 
        Container savedContainer = containerRepository.save(container);
        throw new UnsupportedOperationException("Force Error");
     catch(UnsupportedOperationException e) 
        log.error("Error : ", e.getMessage());
        return retryHistoryRepository.save(new RetryHistory(container.getName()));
    

我强制出错。在这样做时,我认为数据不应该存储在容器表中。并且数据应该存储在 retryHistory 表中。

但出乎我的意料,数据也存储在容器表中。

你能告诉我为什么吗?

【问题讨论】:

不是 100% 确定,但根据我的想法,如果您对实现 Hibernate 的正式方式有想法,请确认一下。您在开始时占用了 Transaction 对象,并且在该事务处理中您得到错误并假设直到该实际对象不可用于处理或您不允许使用相同的对象。简而言之,事务对象不存在用于数据库处理。它在此之前刷新数据库对象。如果您共享错误快照,那就太好了。 【参考方案1】:

事务没有回滚,因为您实际上是在函数中处理异常。所以函数没有抛出UnsupportedOperationException,它以返回retryHistoryRepository.save结束。

要回滚containerRepository.save,您需要将try-catch 移到函数外部并让函数抛出异常,然后spring data 将回滚在该函数内完成的所有操作。如果你想在这个函数中保留逻辑,你也可以使用TransactionTemplate而不是@Transactional。

【讨论】:

如你所说,我抛出了一个异常,它正在回滚。

以上是关于@Transactional 注释 rollbackFor 值在 Spring Boot 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Grails @Transactional 与 Spring @Transactional 注释之间的差异

我必须在哪里使用注释@Service @Transactional

Spring 忽略 @Transactional 注释

@Transactional 注释与 saveAndFlush 一起使用?

@Transactional 注释 rollbackFor 值在 Spring Boot 中不起作用

我应该将@Transactional 注释放在哪里:在接口定义或实现类中?