【问题标题】:Spring rollback transaction partSpring回滚事务部分
【发布时间】:2016-12-06 21:04:04
【问题描述】:

我配置了 spring 和 hibernate 事务(每次服务调用的 aop 和 Throwable 的回滚)。我需要支持 cretePartA() 的以下要求:

  • 不应使主事务失败,在我的示例中为 cteateSmth()
  • 如果失败应该回滚它自己的事务

    service1.cteateSmth();

    /*started in new transaction*/
    public void cteateSmth()
    {
       //...some other inserts
    
       // should not fail main transaction, 
       // but shoud rollback it's own if is failed
       anotherService.cretePartA(); 
    
      //should save state in db in any case
      recordSmthCreation(); 
    }
    
    public void cretePartA(){
       updateSubpartA();
       updateSubPartA1();    
       if(!sucees) throw new ValidationException();
    
    }
    

在上面的示例中,即使尝试对 cretePartA() 进行捕获包装,整个 cteateSmth() 事务也会被回滚。

我尝试使用 REQUIRES_NEW 进行此操作,但在这种情况下我似乎无法回滚 cretePartA() 操作。

TransactionDefinition transactionDefinition = new DefaultTransactionAttribute(TransactionDefinition.Propagation.REQUIRES_NEW);
new TransactionTemplate(transactionManager, transactionDefinition).execute(new TransactionCallback()
{
    @Override
    public Object doInTransaction(TransactionStatus status)
    {
        try{
           cretePartA()
        } catch (Exception e){

        }
        return null;
    }
});

我试图不为 cretePartA() 创建新事务,只是超越了来自 spring aop 的这个服务调用。但在这种情况下,结果将提交给 cretePartA()。

【问题讨论】:

    标签: java spring hibernate transactions spring-transactions


    【解决方案1】:

    我用注释解决了它@Transactional(propagation = Propagation.REQUIRES_NEW) 对于 cretePartA() 方法和 try/catch 块

    【讨论】:

    猜你喜欢
    • 2017-11-21
    • 2011-11-21
    • 2021-10-15
    • 1970-01-01
    • 2016-09-19
    • 2017-03-03
    • 2012-03-10
    • 2018-07-15
    • 2018-11-05
    相关资源
    最近更新 更多