【问题标题】:JPA rollback nested TransactionJPA回滚嵌套事务
【发布时间】:2021-10-19 13:45:31
【问题描述】:

如何回滚嵌套事务?假设如果method5中有异常,那么如何回滚method4也会发生变化。

@Singleton
public class Case {
   @Inject
   CaseService caseService;
    
    @Transactional
    void method2(){
        var value = caseService.method4();
        caseService.method5(value);
    }
}

@Singleton
public class CaseService {
    @Transactional(Transactional.TxType.REQUIRES_NEW)
    public String method4(){
        return "some";
    }
    
    @Transactional(Transactional.TxType.REQUIRES_NEW)
    public void method5(String value){
    }
}

【问题讨论】:

  • 有什么理由不使用默认事务类型 - 需要吗?如果使用默认值,它将按您的预期工作。
  • 为什么method4和method5是分开的事务?

标签: java hibernate jpa micronaut


【解决方案1】:

如果你想回滚method4调用,那么它的语句应该和method5在同一个事务中。

在您提供的代码中,method4method5 始终在单独的事务中执行。

因此,您可以删除 REQUIRES_NEW 属性。

【讨论】:

    【解决方案2】:

    REQUIRES_NEW 将始终创建一个新事务,而不管之前的任何事务。因此,任何回滚都只会发生在该事务上。您想要所有这些(method4method5)意味着method2 应该是原子的。在这种情况下,它们都应该在同一个事务下,这意味着您只需要使用REQUIRED 或根据您的用例在method2method4method5 上启动一个新事务应该需要。

    如果您的任何事务方法抛出RuntimeException,那么它们将自动回滚。如果您还希望回滚检查的异常,那么您需要在注释中提及。

    (rollbackFor=CustomException.class)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      相关资源
      最近更新 更多