Spring回滚事务部分

时间:2016-12-06 21:04:04

标签: java spring hibernate transactions spring-transactions

我有春天&配置了hibernate事务(对每个服务调用执行aop并为Throwable回滚)。我需要支持以下对cretePartA()的要求:

  • 不应该失败主要事务,cteateSmth()在我的例子中
  • 如果失败,请回滚它自己的交易

    service1.cteateSmth();

    
    
        [oracle@ikm-oasb-3 bin]$ for p in `opmnctl status | grep OC4JG | awk '{print $5}'`; do echo -n "PID=$p "; jmap -heap $p | grep -A4 'Perm Gen' | egrep '%'; done 2> /dev/null
        PID=8456    89.31778371334076% used
        PID=8455    89.03931379318237% used
        PID=8454    91.1630779504776% used
        PID=8453    89.17466700077057% used
        PID=8452    87.69496977329254% used
        PID=2979    92.2750473022461% used
        PID=1884    90.25585949420929% used
        PID=785    76.16643011569977% used
        PID=607    89.06879723072052% used
    
    

在上面的示例中,即使尝试抓取cretePartA()的包装,整个cteateSmth()事务也将被回滚。

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

/*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()创建新事务,只是从spring aop中除了这个服务调用。但在这种情况下,结果将被提交给cretePartA()。

1 个答案:

答案 0 :(得分:0)

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