我有以下实现。
@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中以前的写操作是否都将被回滚?
返回:
使用saveAndFlush
非常重要,这样数据才能立即被callAnAggregatedFunction
函数使用并对其进行聚合,并将结果保存到另一个表中。这就是为什么我不使用save
函数,因为据我所知它不会立即将事务刷新到数据库中。
但是,我在saveAndGenerateResult
函数上使用了@Transactional
注释,因为我希望在任何失败的情况下回滚该函数中已完成的数据库事务,这通常通过在方法上使用@Transactional
注解来实现。
在这种特定情况下会发生什么情况?我正在使用saveAndFlush
,它将数据立即刷新到数据库表中,如果最后一个函数(即callAnAggregatedFunction
)未能将数据写入表中,那么表A和表B中以前的写操作是否都将被回滚?