@Transactional注解与saveAndFlush一起使用吗?

33

我有以下实现。

@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中以前的写操作是否都将被回滚?


1
一些解释。https://stackoverflow.com/a/46789481/4423636 - Ataur Rahman Munna
那里的答案很有帮助@AtaurRahmanMunna。感谢并点赞。 :) - Reaz Murshed
很高兴为您效劳。 :) - Ataur Rahman Munna
1个回答

34

非常感谢。如果您能分享一些文档或链接,让我能够更多地了解它,那将是一个很大的帮助。 - Reaz Murshed
非常感谢。这些链接真的很有帮助。 :) - Reaz Murshed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接