@Transactional 注释与 saveAndFlush 一起使用?

Posted

技术标签:

【中文标题】@Transactional 注释与 saveAndFlush 一起使用?【英文标题】:@Transactional annotation works with saveAndFlush? 【发布时间】:2018-09-26 01:33:32 【问题描述】:

我有以下实现。

@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中的先前写入操作会回滚吗?

【问题讨论】:

一些解释。 ***.com/a/46789481/4423636 那里的答案很有帮助@AtaurRahmanMunna。表示感谢。 :) 我的荣幸。 :) 【参考方案1】:

表A和表B之前的写操作会不会被回滚?

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

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

欲了解更多信息:Spring - @Transactional - What happens in background?

Spring @Transactional - isolation, propagation

【讨论】:

非常感谢。如果您能分享一些文档或链接,这将是一个很大的帮助,以便我可以阅读更多相关信息。 我真的不知道会记录在哪里。您在询问事务是否像定义的那样工作。当您回滚事务时,更改会回滚。不过好吧,我会添加一个链接。 非常感谢。这些链接真的很有帮助。 :)

以上是关于@Transactional 注释与 saveAndFlush 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

@Transactional 与 JPA 和 Hibernate 有啥用?

@Transactional 方法调用另一个没有@Transactional 注释的方法?

我必须在哪里使用注释@Service @Transactional

Spring 忽略 @Transactional 注释

@Transactional 注释 rollbackFor 值在 Spring Boot 中不起作用

Spring @transactional 是不是与 MongoDB 一起使用?