解决方案 »

  1.   

    你不是基于注解的吗,这是基于注解的方式使用事务配置声明,试试 <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
    <!-- enable autowire -->
    <context:annotation-config />
      

  2.   

    你采用哪种事务配置方式,注解还是AOP方式?
      

  3.   

    http://www.blogjava.net/robbie/archive/2009/04/05/264003.html楼主参考一下
      

  4.   

    把service里的代码也发点出来啊,
      

  5.   

    首先感谢大家的帮助。<context:annotation-config />
    我有以上配置,但是没有annotation-driven。我是先按照aop配置的,发现没有作用;
    又改成全注解方式,也是参考了@baohuan_love说的地址,还是没有作用,所以现在发出来的内容是基于aop的,我在网上看了一下说是aop也需要增加@Transactional,还是无法解决。
    我估计是和我使用spring+hibernate集成的使用有关,可能没有配置好,什么地方不合适导致,我只配置了一个数据源(proxool),使用getHibernateTemplate获取的可能不是同一个连接。
      

  6.   

    @Transactional
    @Service
    public class TopicServiceImpl implements TopicService {
    @Autowired
    private TopicDao topicDao; public Long save(Topic topic) {
    Long id = (Long) topicDao.save(topic);
    topic.setName("这是测试");
    if ("abc".equalsIgnoreCase(topic.getContent())) {
    throw new RuntimeException("测试");
    }
    topicDao.update(topic);
    return id;
    }
      

  7.   

    你是所有带有save前缀的方法都会使用事务,看看你的方法是否正确
      

  8.   

    DAO是采用了一个基类,如下:public class BaseDao<T> {
    private HibernateTemplate hibernateTemplate;
                       public Serializable save(Object entity) {
    return getHibernateTemplate().save(entity);
    }
                      @Resource(name = "hibernateTemplate")
    public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
    this.hibernateTemplate = hibernateTemplate;
    }调试发现,设置的hibernateTemplate是xml中配置的,但是这个模块是org.hibernate.impl.SessionFactoryImpl,而不是配置的org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean,估计和这个有关吧。
      

  9.   

    用的是oracle,应该不会出现不支持回滚的问题。
    调试的过程中,没有发现使用事务的类。
      

  10.   


    java.lang.RuntimeException: 测试
    at com.abc.forum.service.impl.TopicServiceImpl.save(TopicServiceImpl.java:25)
    at com.abc.forum.controller.TopicsController.addTopic(TopicsController.java:124)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)我觉得是事务都没有使用,错误栈中都没有事务相关的类。
      

  11.   

    expression="execution(* com.abc.*.service.*.*(..))"   指定的切点是否正确? 只有执行了这里aop切入的方法,spring才会开起事务。你aop已经配了,注解是多余的。
    你可以断点到TransactionInterceptor的invoke方法里面,验证你的方法是否被aop切入事务。
    还有如果被aop Interceptor拦截到的话, eclipse(我不确定你的有没有,我用的sts有)是可以在方法的行号旁边看aop拦截标识的。 一个类似于"("的符号。Multiple ers at this line
        - implements com.xxxx.xxx.xxxService.xxxx
        - advised by 
         org.springframework.transaction.interceptor.TransactionInterceptor.invoke(org.aopalliance.intercept.MethodInvocation)鼠标放到符号上还有上面的提示
      

  12.   

    spring会对事务做管理,里面规定了什么样的方法调用它会经过事务的管理,比如你配置的<tx:method name="update*" propagation="REQUIRED"/>,这个表明你调用action中调用update的方法名字必须为update*(),这样它才会纳入事务的管理,才会commit
      

  13.   

    问题已经解决,感谢各位的帮助。原因是springMVC中的配置有冲突。具体解决方案:mvc 的只扫描controller组件 注意使用 use-default-filters="false" 
    <context:component-scan base-package="com.abc" use-default-filters="false" >
     <context:include-filter expression=".*Controller$" type="regex"/>
     </context:component-scan> 服务的扫描除controller外的所有组件 
    <context:component-scan base-package="com.abc" > 
    <context:exclude-filter expression=".*Controller$" type="regex"/>
     </context:component-scan>