REQUIRES_NEW没有在spring + hibernate中创建新事务

时间:2014-04-07 10:48:41

标签: java hibernate spring-transactions

我有一个Spring和hibernate应用程序(两个最新版本),我有两个bean,如下所述

@Component
public class Bean1{

@Autowired 
Bean2 bean2;

@Transactional(propagation = Propagation.REQUIRED)
public void foo()
{
    bean2.bar();
}


@Component
public class Bean2{

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void bar()
{
    try{
           // Do something which throws exception
    }
    catch (Exception e) {
        log & eat the exception here only.
        But inspite of this the outer transaciton gets rolled back
    }
}

问题是当bean2.bar导致任何异常(例如外来Key ConstraintViolationException)时,它会回滚外部事务并说“事务已回滚,因为它已被标记为仅回滚”, “moreInfo”: “”}“

在看到hibernate日志时,我发现“新事务”只有一行

D| o.s.o.h.HibernateTransactionManager- Creating new transaction with name ... PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''

这意味着没有为内部bean2.bar();

创建新事务

我无法弄清楚这里有什么问题?任何帮助是极大的赞赏。

1 个答案:

答案 0 :(得分:1)

REQUIRES_NEW仅适用于JTA交易经理。 请参阅Spring Doc here

  

<强> REQUIRES_NEW
  public static final Propagation REQUIRES_NEW

     

非事务性执行,暂停当前事务(如果有)   存在。类似于同名的EJB事务属性。
注意:   实际的交易暂停不适用于所有的开箱即用   交易经理。这尤其适用于   JtaTransactionManager,需要   javax.transaction.TransactionManager将其提供给它   (在标准J2EE中是特定于服务器的)。