我有以下实现。
@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
函数,据我所知,它不会立即将事务刷新到数据库中。
但是,我在函数@Transactional
上使用saveAndGenerateResult
注释,因为我想回滚我在该函数中完成的数据库事务,以防出现任何通常由于对方法的@Transactional
注释。
在这个具体案例中会出现什么情况?我正在使用saveAndFlush
将数据立即刷新到数据库表中,如果最后一个函数(即callAnAggregatedFunction
)无法将数据写入表中,那么表A和表B中的先前写操作将是会被回滚吗?
答案 0 :(得分:6)
表A和表B中的先前写操作是否会被回滚?
是的,除非您的saveAndFlush()
方法有自己的交易(即使用propagation = REQUIRES_NEW
)。
如果它们是您在saveAndGenerateResult()
中开始的事务的全部内容,则对数据库所做的所有修改都将在发生故障时回滚。
有关详细信息:Spring - @Transactional - What happens in background?