我有春天&配置了hibernate事务(对每个服务调用执行aop并为Throwable回滚)。我需要支持以下对cretePartA()的要求:
如果失败,请回滚它自己的交易
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()。
答案 0 :(得分:0)
我用注释@Transactional(propagation = Propagation.REQUIRES_NEW)
解决了这个问题
对于cretePartA()方法和try / catch块