Spring Service在异常后不回滚事务

时间:2018-03-01 18:11:30

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

我在我的一个App屏幕中使用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);
        }
    }
}

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

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

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

之类的例外情况

请帮帮我。谢谢。

2 个答案:

答案 0 :(得分:1)

尽管已经很晚了,但我想发布答案,因为有人会觉得这很有用。我通过使用资源here

在我的Spring启动应用程序中实现JPA事务管理器来修复错误

答案 1 :(得分:0)

似乎@Transactional不适合你。我可以理解,您的应用程序中有一些配置可能是不负责创建DataSourceTransactionManager的。如此处所述,这应该是自动的:

  

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

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

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

repo.save(cars);

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

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

更多详情here