Spring声明式事务的回滚是否可以推迟

时间:2018-07-27 15:23:15

标签: spring hibernate spring-transactions

问题: 有没有一种方法可以让Spring声明式事务推迟对异常的回滚?

用例

  • 我必须在一次交易中一起处理多个实体。
  • 处理单个实体的结果是数据库中有一些新记录,并且对现有记录进行了一些更新。
  • 如果对任何这些实体的处理导致异常,则需要回滚事务。因此,必须成功处理所有实体,才能落实交易。
  • 转折点:我想一次性检测所有处理异常的实体。我不想运行一次处理,在5号实体上失败,修复5号实体上的问题,然后再次运行处理,只是遇到7号实体上的异常。

因此,我要实现的目标是收集处于故障状态的实体上的所有错误,并通知某人进行修复。因此,我希望封装所有实体处理的事务能够进行到最后一个实体,然后才需要回滚。

到目前为止我尝试过的事情:

像这样propagation = NESTED使用

@Transactional
void processAllEntities() {
    entities = fetchEntities();
    for (entity : entities) {
        processSingleEntity();
    }
}

@Transactional(propagation = NESTED)
void processSingleEntity(entity) {
    do stuff;
}

请注意,以上方法在不同的@Component注释类中,并且processAllEntities()从第三类调用。

此操作失败,因为JpaDialect不支持保存点。

我尝试按照DataSourceTransactionManager的javadoc中的建议切换到Propagation.NESTED,但是由于此事务管理器似乎JPA并不了解,并且我的整个模型都映射了{ {1}}批注,而我使用JPA来保持持久性。

欢迎任何想法和反馈。谢谢。

0 个答案:

没有答案