日期:2014-05-17  浏览次数:20664 次

Spring 事务管理
用的ssh,其中有个方法想不用spring提交事务,就自己提交了getSession().getTransaction().commit();提交后又开启了事务getSession().beginTransaction();但是还是会报org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started
org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:660)
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
$Proxy18.addKaraoke(Unknown Source)


请问我又开启了事务,为什么还是会报事务开启不成功的错误,hibernate不能commit;我用的for循环,每循环一次提交一次开启一次,每次循环提交事务都没有问题,只是最后spring自己提交事务时报错
------最佳解决方案--------------------
你这样写其实都没开启事务

Session session = steelfactory.openSession();//opensession需要手动关闭

Transaction tx = session.beginTransaction();//获取事务

try{
tx.begin();//开启事务
//你的逻辑
tx.commit();//提交事务

}catch(Exception e){
tx.rollback();//回滚
throw e;
}finally{
session.clear();
session.close();
}


还有最好别循环控制事务、这样很耗费性能、

事务包围循环还可以、
------其他解决方案--------------------
引用:
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean……

楼主的配置:

<aop:config>
    <aop:pointcut id="bussinessService" expression="execution(* com.tlcy.service..*.*(..))" />
    <aop:advisor pointcut-ref="bussinessService" advice-ref="txAdvice" />
</aop:config>

注意下,这里是对所有service下所有类、所有方法配置事务。
然后,是关于Spring的启动问题。Spring启动之后,会根据配置,对关联方法生成代理,也就是项目启动时,这些方法就被Spring包了一层。所以你此时再在方法内部开启事务,就会出现问题。
所以,要修改此处的配置。
------其他解决方案--------------------
引用:
你这样写其实都没开启事务

Java code?12345678910111213141516Session session = steelfactory.openSession();//opensession需要手动关闭 Transaction tx = session.beginTransaction();//获取事务 try{            tx.beg……



请问,那spring的事务,我能不能拿过来控制,本来spring是控制事务,我的到事务后提交,然后再开启,spring为什么就不认了,只是spring报上面我说的异常
------其他解决方案---------------