spring事务不生效

moonboy1980 2014-07-07 11:36:20
遇到了一个spring配置事务不能生效的问题,在网上查了一下各种解决方案,但还是不能解决,不知道问题根源在哪里,请各位大神指点,非常感谢。

<bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="driver">
......
<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="packagesToScan">
<list>
<value>com.abc</value>
</list>
</property>
......
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="mySessionFactory"></property>
</bean>

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

<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" />
<tx:method name="*" read-only="true" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>

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

不知道是不是配置的问题,代码采用的是springMVC+spring+hibernate的框架,采用的是注解方式,service和DAO中都使用过注解定义事务,仍然没有作用,数据操作采用的是getHibernateTemplate().save...。
...全文
1335 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
moonboy1980 2014-07-09
  • 打赏
  • 举报
回复
问题已经解决,感谢各位的帮助。 原因是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>
whos2002110 2014-07-08
  • 打赏
  • 举报
回复
expression="execution(* com.abc.*.service.*.*(..))" 指定的切点是否正确? 只有执行了这里aop切入的方法,spring才会开起事务。你aop已经配了,注解是多余的。 你可以断点到TransactionInterceptor的invoke方法里面,验证你的方法是否被aop切入事务。 还有如果被aop Interceptor拦截到的话, eclipse(我不确定你的有没有,我用的sts有)是可以在方法的行号旁边看aop拦截标识的。 一个类似于"("的符号。

Multiple markers at this line
    - implements com.xxxx.xxx.xxxService.xxxx
    - advised by 
     org.springframework.transaction.interceptor.TransactionInterceptor.invoke(org.aopalliance.intercept.MethodInvocation)
鼠标放到符号上还有上面的提示
moonboy1980 2014-07-08
  • 打赏
  • 举报
回复

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)
我觉得是事务都没有使用,错误栈中都没有事务相关的类。
yufengdxw 2014-07-08
  • 打赏
  • 举报
回复
spring会对事务做管理,里面规定了什么样的方法调用它会经过事务的管理,比如你配置的<tx:method name="update*" propagation="REQUIRED"/>,这个表明你调用action中调用update的方法名字必须为update*(),这样它才会纳入事务的管理,才会commit
moonboy1980 2014-07-07
  • 打赏
  • 举报
回复
用的是oracle,应该不会出现不支持回滚的问题。 调试的过程中,没有发现使用事务的类。
moonboy1980 2014-07-07
  • 打赏
  • 举报
回复
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,估计和这个有关吧。
业余草 2014-07-07
  • 打赏
  • 举报
回复
你是所有带有save前缀的方法都会使用事务,看看你的方法是否正确
xiaofanac66 2014-07-07
  • 打赏
  • 举报
回复
我怀疑是你的类名起错了(包括包名),配置文件没什么大问题,就算你基于注解但是你的事务是不需要基于注解的。
moonboy1980 2014-07-07
  • 打赏
  • 举报
回复
@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; }
moonboy1980 2014-07-07
  • 打赏
  • 举报
回复
首先感谢大家的帮助。 <context:annotation-config /> 我有以上配置,但是没有annotation-driven。 我是先按照aop配置的,发现没有作用; 又改成全注解方式,也是参考了@baohuan_love说的地址,还是没有作用,所以现在发出来的内容是基于aop的,我在网上看了一下说是aop也需要增加@Transactional,还是无法解决。 我估计是和我使用spring+hibernate集成的使用有关,可能没有配置好,什么地方不合适导致,我只配置了一个数据源(proxool),使用getHibernateTemplate获取的可能不是同一个连接。
高仿的版主 2014-07-07
  • 打赏
  • 举报
回复
把service里的代码也发点出来啊,
ZHOU西口 2014-07-07
  • 打赏
  • 举报
回复
你采用哪种事务配置方式,注解还是AOP方式?
arakawa 2014-07-07
  • 打赏
  • 举报
回复
你不是基于注解的吗,这是基于注解的方式使用事务配置声明,试试 <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> <!-- enable autowire --> <context:annotation-config />

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧