2011-12-22 39 views
2

我面临的一个问题,我有一个方法,该方法是调用另一个方法在服务层如下:@Transaction问题:TransactionSynchronization.beforeCompletion抛出异常

@Transactional 
    @Override 
    public void method1(List<String> vals) 
    { 
     for (String value : vals){ 
      method2(value); 
     } 
    } 

@Transactional(propagation= Propagation.REQUIRED) 
public void method2(String value) 
{ 
    //Hibernate Call 1 

    //Hibernate Call 2 

} 

我已经把Transactional注解方法2因为它也可以从Controller中调用。

我的事务管理器看起来是这样的:

<tx:annotation-driven transaction-manager="transactionManager"/> 
<aop:aspectj-autoproxy/> 

<!-- Transaction manager for hibernate --> 

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
    <property name="dataSource" ref="dataSource"></property> 

</bean> 

当控制器调用方法1这是给下面的错误,当我运行这段代码:

11年12月22日18:4455410:ERROR [HTTP-8181-1] (.support.TransactionSynchronizationUtils:87) - TransactionSynchronization.beforeCompletion抛出异常 java.lang.IllegalStateException:用于密钥 [org.hib No值[email protected]]结合到线程 [HTTP-8181-1在org.springframework.orm.hibernate3.SpringSessionSynchronization] 在org.springframework.transaction.support.TransactionSynchronizationManager.unbindResource(TransactionSynchronizationManager.java:190) .beforeCompletion(SpringSessionSynchronization.java:187) 在org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCompletion(TransactionSynchronizationUtils.java:84) 在org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCompletion(AbstractPlatformTransactionManager.java:895) 在org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:693) at org.spri ngframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:678) 在org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321) 在org.springframework.transaction.interceptor.TransactionInterceptor.invoke( TransactionInterceptor.java:116) 在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 在org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 在$ Proxy31 .method1(Unknown Source)

回答

0

我看不出这段代码有什么问题。有一件事你可以尝试一种解决方法:将method2代码提取到另一个方法,例如method3没有@Transactional,并从方法2和方法1中调用它,保留@Transactional

一个侧面的问题:method1和method2在同一个类中吗?如果它们是和JDK代理被使用,则方法2周围的@Transactional将在从method1调用时被忽略。