@Transactional注释是否适用于 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
}

使用数据立即可供函数使用以获取聚合结果并将其保存到另一个表非常重要。这就是为什么我没有使用函数,据我所知,它不会立即将事务刷新到数据库中。saveAndFlushcallAnAggregatedFunctionsave

但是,我正在对函数使用注释,因为我想回滚我在该函数中完成的数据库事务,以防发生任何故障,这通常可以通过对方法进行注释来确保。@TransactionalsaveAndGenerateResult@Transactional

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


答案 1

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

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

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

欲了解更多信息:春季 - @Transactional - 背景中会发生什么?

弹簧@Transactional - 隔离、传播


答案 2

推荐