@Transactional注释可以与saveAndFlush一起使用吗?

Rea*_*hed 7 java hibernate transactional spring-data-jpa spring-boot

我有以下实现。

@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
}
Run Code Online (Sandbox Code Playgroud)

重要的saveAndFlush是使数据立即可供callAnAggregatedFunction函数使用,以获取汇总结果并将其保存到另一个表中。这就是为什么我不使用save据我所知不会立即将事务刷新到数据库中的函数的原因。

但是,我@Transactional在函数上使用了注释saveAndGenerateResult,因为在发生任何故障的情况下,我想回退在该函数中完成的数据库事务,通常通过@Transactional在方法上进行注释可以确保发生任何故障。

在这种特定情况下会发生什么情况?我正在使用saveAndFlush哪种方法将数据立即刷新到数据库表中,并且如果最后一个函数(即callAnAggregatedFunction)无法将数据写入表中,将回退表A和表B中的先前写入操作吗?

Kay*_*man 12

是否会回滚表A和表B中先前的写操作?

是的,除非您的saveAndFlush()方法有自己的交易(例如,使用propagation = REQUIRES_NEW)。

如果它们都是您开始的事务的一部分,则saveAndGenerateResult()在失败的情况下将回滚对数据库所做的所有修改。

有关更多信息:Spring-@Transactional-后台会发生什么?

Spring @Transactional-隔离,传播

  • 我真的不知道在哪里记录。您在问事务是否像定义的那样起作用。回滚事务时,更改也会回滚。但是好吧,我将添加一个链接。 (2认同)