java - @Transactional 注释与 saveAndFlush 一起使用?

标签 java hibernate spring-boot spring-data-jpa transactional

我有以下实现。

@Transactional
public void saveAndGenerateResult(Data data) {
    saveDataInTableA(data.someAmountForA);
    saveDataInTableB(data.someAmountForB);
    callAnAggregatedFunction(data);
}

public void saveDataInTableA(DataA a) {
    tableARepository.saveAndFlush(a);
}

public void saveDataInTableA(DataB b) {
    tableBRepository.saveAndFlush(b);
}

public void callAnAggregatedFunction() {
    // Do something based on the data saved from the beginning in Table A and Table B
}

重要的是使用 saveAndFlush 让数据立即可用于 callAnAggregatedFunction 函数以获得聚合结果并将其保存到另一个表。这就是为什么我没有使用 save 功能,据我所知,该功能不会立即将事务刷新到数据库中。

但是,我在函数 saveAndGenerateResult 上使用了一个 @Transactional 注释,因为我想回滚我在该函数中完成的数据库事务,以防万一通常通过在方法上使用 @Transactional 注释来确保失败。

在这种特定情况下会发生什么情况?我正在使用 saveAndFlush 将数据立即刷新到数据库表中,如果最后一个函数(即 callAnAggregatedFunction)无法将数据写入表中,那么之前的写入操作是否会执行在表A和表B中会被回滚?

最佳答案

Will the previous write operations in table A and table B be rollbacked?

是的,除非您的 saveAndFlush() 方法有自己的事务(即使用 propagation = REQUIRES_NEW)。

如果它们都是您在 saveAndGenerateResult() 中启动的事务的一部分,则在出现故障时将回滚对数据库所做的所有修改。

更多信息:Spring - @Transactional - What happens in background?

Spring @Transactional - isolation, propagation

关于java - @Transactional 注释与 saveAndFlush 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49855138/

相关文章:

Hibernate:限制一对多查询

java - Spring Boot : Spring always assigns default value to property despite of it being present in . 属性文件

java - 有没有办法避免具有不同背景的重复 Cucumber 场景?

java - java的makefile,仅在文件更改时重新编译

java - 如何在没有HQL的情况下在Hibernate中执行普通的SQL查询?

Spring Boot安全配置忽略允许的端点

java - 如何在 Spring MVC Controller 中接收多部分/表单数据?

java - SwipeRefreshLayout 只显示一项?

java - 当方法接受字符串数组作为参数并且参数有一些值时的 mock Java

java - 持久化配置问题