@Transactional 注释与 saveAndFlush 一起使用?
@Transactional annotation works with saveAndFlush?
我有以下实现。
@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
函数以获得聚合结果并将其保存到另一个 table。这就是为什么我没有使用 save
函数,据我所知,该函数不会立即将事务刷新到数据库中。
但是,我在函数 saveAndGenerateResult
上使用了 @Transactional
注释,因为我想回滚我在该函数中完成的数据库事务,以防万一发生任何通常可以确保的故障通过在方法上添加 @Transactional
注释。
在这个具体案例中会发生什么情况?我正在使用 saveAndFlush
将数据立即刷新到数据库 table 并且如果最后一个函数(即 callAnAggregatedFunction
)无法将数据写入 table,那么前一个table A 和 table 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
我有以下实现。
@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
函数以获得聚合结果并将其保存到另一个 table。这就是为什么我没有使用 save
函数,据我所知,该函数不会立即将事务刷新到数据库中。
但是,我在函数 saveAndGenerateResult
上使用了 @Transactional
注释,因为我想回滚我在该函数中完成的数据库事务,以防万一发生任何通常可以确保的故障通过在方法上添加 @Transactional
注释。
在这个具体案例中会发生什么情况?我正在使用 saveAndFlush
将数据立即刷新到数据库 table 并且如果最后一个函数(即 callAnAggregatedFunction
)无法将数据写入 table,那么前一个table A 和 table 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