spring的声明式事务处理没有rollback

LittleLeeZi 2014-08-08 05:57:21

<!-- mybatis -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
</bean>

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.yuansheng.abroad" />
</bean>

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception"/><!-- 支持当前事务,如果执行到add开头的任何方法时没有事务则开启一个事务 这是最常见的方式 -->
<tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
<tx:method name="register*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
<tx:method name="modify*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
<tx:method name="edit*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
<tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
<tx:method name="change*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
<tx:method name="toggle*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
<tx:method name="del*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
<tx:method name="get*" read-only="true"/>
</tx:attributes>
</tx:advice>

<!-- 配置参与事务的类 -->
<aop:config>
<aop:pointcut id="txMethod" expression="execution(* com.yuansheng.abroad.service.impl.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="txMethod" />
</aop:config>

如上所示,项目采用springmvc+mybatis,测试com.yuansheng.abroad.service.impl.InvestServiceImpl.toogleRecommend()方法,主动抛出空指针异常,数据没有回滚。
1,数据表采用的是innoDB引擎,支持事务回滚
2,在DataSourceTransactionManager中的各方法上打断点,getDataSource()执行到了,但doCommit()和doRollback()都没有执行到。
求大神指教
...全文
422 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lizhi373717096 2016-03-26
  • 打赏
  • 举报
回复
在主容器中(applicationContext.xml),将Controller的注解排除掉 1 2 3 <context:component-scan base-package="com"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> 而在springMVC配置文件中将Service注解给去掉 1 2 3 4 <context:component-scan base-package="com"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> </context:component-scan> 因为spring的context是父子容器,所以会产生冲突,由ServletContextListener产生的是父容器,springMVC产生的是子容器,子容器Controller进行扫描装配时装配了@Service注解的实例,而该实例理应由父容器进行初始化以保证事务的增强处理,所以此时得到的将是原样的Service(没有经过事务加强处理,故而没有事务处理能力。 还有一种方式是将service层改用xml配置,其实这样做也是变相的让springmvc无法扫描service,而只能依赖父窗口也就是ServletContextListener来进行初始化,这样同样被赋予了事务性。
LittleLeeZi 2014-08-08
  • 打赏
  • 举报
回复
我把事务配置到springMVC的配置文件里就可以回滚了,在spring的配置文件application.xml中就不行,是加载顺序的问题吗
LittleLeeZi 2014-08-08
  • 打赏
  • 举报
回复
引用 3 楼 u011511684 的回复:
楼主,看到你问题了,<tx:method name="toggle*" propagation="REQUIRED" rollback-for="java.lang.Exception" />与你service里的实现方法对应不上,你的service方法com.yuansheng.abroad.service.impl.InvestServiceImpl.toogleRecommend()。 toogleRecommend和name="toggle*"这个方法对应不上啊service是toogle,比spring配置文件多了一个o
你观察的很仔细,我检查了一下,是我发帖子的时候写错了,方法名确实是toggle开头
LittleLeeZi 2014-08-08
  • 打赏
  • 举报
回复
引用 2 楼 u011511684 的回复:
楼主,能不能看一下你后台怎样抛出异常?
只是数据不回滚
java.lang.NullPointerException
	at com.yuansheng.abroad.service.impl.InvestServiceImpl.toggleRecommentStatus(InvestServiceImpl.java:162)
	at com.yuansheng.abroad.controller.InvestController.toggleRecommend(InvestController.java:182)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
	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:749)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:619)
主动上抛的一个空指针异常,为了测试数据是否回滚
hiu1989 2014-08-08
  • 打赏
  • 举报
回复
楼主,看到你问题了,<tx:method name="toggle*" propagation="REQUIRED" rollback-for="java.lang.Exception" />与你service里的实现方法对应不上,你的service方法com.yuansheng.abroad.service.impl.InvestServiceImpl.toogleRecommend()。 toogleRecommend和name="toggle*"这个方法对应不上啊service是toogle,比spring配置文件多了一个o
hiu1989 2014-08-08
  • 打赏
  • 举报
回复
楼主,能不能看一下你后台怎样抛出异常?
LittleLeeZi 2014-08-08
  • 打赏
  • 举报
回复
大神们,求救啊

81,092

社区成员

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

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