【问题标题】:Spring Service not rolling back the transaction after exception异常后Spring Service不回滚事务
【发布时间】:2018-08-09 21:36:29
【问题描述】:

我在我的一个应用程序屏幕中使用 Spring JpaRepository 实现 CRUD。作为其中的一部分,我正在开发一个功能,用户可以将所有 Car 实体或任何内容(应该回滚)保存到数据库中。我不确定如何使用 Spring Boot、Spring Rest、Spring Jpa 实现此功能。

下面是我的源代码。

@Repository
interface CarRepository extends JpaRepository<Car, Integer> { }

@Service
class CarService {

    @Autowired
    CarRepository repo;

    @Transactional(rollbackFor=RuntimeException.class)
    public List<Car> saveAllOrNone(List<Car> cars) {
        for(Car car: cars) {
            repo.save(car);
        }
    }
}

我无法弄清楚我做错了什么。

当我使用两个不同的数据进行测试时,其中一个有无效数据,另一条记录被插入到数据库中而不是被回滚。

除此之外,我还收到了 UOWManager transaction processing failed:nested exception is com.ibm.wsspi.uow.UOWException: javax.transaction.RollbackException 之类的异常

请帮帮我。谢谢。

【问题讨论】:

  • 我不明白这个问题。回滚不起作用吗?会发生什么?
  • 是的,它不会回滚成功的实体。
  • 只有在事务内部出现错误时才会发生回滚。当你坚持汽车时会发生错误吗?
  • 是的,我故意使用无效数据(例如 First name 设置为 null)对其进行了测试。
  • 尝试使用repo.save(cars),不使用迭代器。另外,尝试在您的应用程序上添加@EnableTransactionManagement

标签: hibernate spring-boot spring-data-jpa


【解决方案1】:

即使已经晚了,我还是想发布答案,因为有人会觉得这很有用。我通过使用资源 here 在我的 Spring Boot 应用程序中实现 JPA 事务管理器来修复错误

【讨论】:

    【解决方案2】:

    似乎@Transactional 不适合您。我可以理解您的应用程序中有一些配置可能导致不创建DataSourceTransactionManager。正如这里所解释的,这应该是自动的:

    Spring Boot 将在类路径和 h2 上检测 spring-jdbc 并将 自动为您创建一个 DataSource 和一个 JdbcTemplate。因为 此类基础设施现已可用,而您没有专门的 配置,也会创建一个 DataSourceTransactionManager 你:这是拦截@Transactional的组件 注释方法

    所以我看到了两种解决您问题的方法。

    第一个是使用 Spring Repository 中的 save 方法,它可以接受您的汽车列表:

    repo.save(cars);
    

    这会起作用,因为 Spring 有一个用于存储库方法的内部 @Transactional。

    另一种选择是与您的@SpringBootApplication 一起添加注释@EnableTransactionManagement,手动启用Spring 应该为您做的事情。

    更多详情here.

    【讨论】:

    • 我也试过删除@SpringBootApplication 上的@EnableTransactionManagement 注释,它奏效了。所以,我不应该使用 For each 循环显式地迭代它。非常感谢 Dherik。
    • 哦,不,回滚正在按预期发生,但是,异常一次又一次地出现,我尝试删除 Service 方法上的 @Transactional 注释,然后抛出像 Exception caught from before_synchronization operation: java.lang.UnsupportedOperationException 这样的异常.
    • 堆栈跟踪是:Exception caught from before_synchronization operation: java.lang.UnsupportedOperationException at org.hibernate.engine.transation.jta.platform.internal.WebsphereJtaExtendedPlatform.TransactionManagerAdaptor.setRollBackOnly
    • @DilipKumar 我认为您的问题出在 WebSphere:stackoverflow.com/a/38173907/2387977
    • 我没有得到帖子中提供的详细信息,但是,这个错误是预期的还是应该忽略的?
    猜你喜欢
    • 1970-01-01
    • 2022-07-22
    • 2016-08-14
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 2019-06-22
    • 2015-10-03
    • 2015-03-02
    相关资源
    最近更新 更多