`
这些年
  • 浏览: 397845 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

springmvc mybatis 事务不回滚(转)

 
阅读更多

转自:http://blog.csdn.net/will_awoke/article/details/12002705

 

前文提到,最新换了框架,新项目用SpringMVC + Spring JdbcTemplate。搭框架时,发现了一个事务无法正常回滚的问题,记录如下:

首先展示问题:

Spring applicationContext.xml配置:

 

[html] view plaincopy
  1.          
  2. <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">  
  3.     <property name="jndiName">  
  4.         <value>java:comp/env/jdbc/will</value>  
  5.     </property>  
  6. </bean>   
  7.       
  8. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
  9.     <property name="dataSource" ref="dataSource" />  
  10. </bean>  
  11.   
  12. <bean id="txManager"  
  13.     class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  14.     <property name="dataSource" ref="dataSource" />  
  15. </bean>  
  16.   
  17. <!-- 事务控制   -->  
  18. <tx:annotation-driven transaction-manager="txManager" />  


 

 

Spring mvc.dispatcher.xml配置:

 

[html] view plaincopy
  1. <!-- 自动扫描的包名 -->    
  2. <context:component-scan base-package="com.will" >   
  3. </context:component-scan>  
  4.   
  5. <!-- 默认的注解映射的支持 -->  
  6. <mvc:annotation-driven />  
  7.   
  8. <!-- 对静态资源文件的访问  -->    
  9. <mvc:default-servlet-handler/>    
  10.     
  11.       
  12. <!-- 拦截器    
  13. <mvc:interceptors>    
  14.     <bean class="com.will.mvc.MyInteceptor" />    
  15. </mvc:interceptors>   
  16. -->   
  17.   
  18. <!-- 视图解释类 -->   
  19. <bean id="viewResolver"    
  20.     class="org.springframework.web.servlet.view.UrlBasedViewResolver">    
  21.     <property name="viewClass"  value="org.springframework.web.servlet.view.JstlView" />    
  22.     <property name="prefix" value="/WEB-INF/pages/" />    
  23.     <property name="suffix" value=".jsp" />    
  24. </bean>     


然后在Service层模拟了一个事务回滚的method case:

 

 

[java] view plaincopy
  1. @Transactional  
  2. public boolean save(Person person)  
  3. {  
  4.    for(int id: new int[]{2,3})  
  5.     {  
  6.         personDao.del(id);  
  7.         int j = 1/0;  
  8.     }                  
  9.      
  10.     return false;  
  11. }  


 

本以为大功告成,在运行save方法时,由于1/0 抛出 java.lang.ArithmeticException: / by zero  RuntimeException,导致事务回归。However,no way! So crazy~

查了下,发现Spring MVC对于事务配置比较讲究,需要额外的配置。解决办法如下:


 

 

需要在 applicationContext.xml增加:

 

[html] view plaincopy
  1. <context:component-scan base-package="com.will">   
  2.     <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />   
  3. </context:component-scan>  


在 Spring mvc.dispatcher.xml增加:

 

 

[html] view plaincopy
  1. <context:component-scan base-package="com.will" >   
  2.     <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />   
  3.     <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />    
  4. </context:component-scan>  

 

由于web.xml中配置:

 

[html] view plaincopy
  1. <context-param>  
  2.     <param-name>contextConfigLocation</param-name>  
  3.     <param-value>  
  4.              classpath:applicationContext.xml  
  5.     </param-value>  
  6. </context-param>  
  7. <listener>  
  8.     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  9. </listener>  
  10. <servlet>  
  11.     <servlet-name>dispatcher</servlet-name>  
  12.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  13.     <init-param>  
  14.          <param-name>contextConfigLocation</param-name>  
  15.          <param-value>classpath*:/mvc_dispatcher_servlet.xml</param-value>  
  16.     </init-param>  
  17.     <load-on-startup>1</load-on-startup>  
  18. </servlet>  
  19. <servlet-mapping>  
  20.     <servlet-name>dispatcher</servlet-name>  
  21.     <url-pattern>*.do</url-pattern>  
  22. </servlet-mapping>  

 

 

Spring容器优先加载由ServletContextListener(对应applicationContext.xml)产生的父容器,而SpringMVC(对应mvc_dispatcher_servlet.xml)产生的是子容器。子容器Controller进行扫描装配时装配的@Service注解的实例是没有经过事务加强处理,即没有事务处理能力的Service,而父容器进行初始化的Service是保证事务的增强处理能力的。如果不在子容器中将Service exclude掉,此时得到的将是原样的无事务处理能力的Service。

 

经过以上分析,故可以优化上述配置

 

在 applicationContext.xml增加:

 

[html] view plaincopy
  1. <context:component-scan base-package="com.will">   
  2. </context:component-scan>  


在 Spring mvc.dispatcher.xml增加:

 

 

[html] view plaincopy
  1. <context:component-scan base-package="com.will" >      
  2.     <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />    
  3. </context:component-scan>  
 

经过如上配置,可以发现事务控制部分的日志如下:

 

[html] view plaincopy
  1. 2013-09-25 09:53:13,031 [http-8080-2] DEBUG [org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] - Adding transactional method 'save' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''  
  2. 2013-09-25 09:53:13,037 [http-8080-2] DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] - Returning cached instance of singleton bean 'txManager'  
  3. 2013-09-25 09:53:13,050 [http-8080-2] DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - Creating new transaction with name [com.will.service.impl.PersonServiceImpl.save]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''  
  4. 2013-09-25 09:53:13,313 [http-8080-2] DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - Acquired Connection [jdbc:mysql://localhost:3306/mvc?useUnicode=true&characterEncoding=UTF-8, UserName=root@localhost, MySQL-AB JDBC Driver] for JDBC transaction  
  5. 2013-09-25 09:53:13,323 [http-8080-2] DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - Switching JDBC Connection [jdbc:mysql://localhost:3306/mvc?useUnicode=true&characterEncoding=UTF-8, UserName=root@localhost, MySQL-AB JDBC Driver] to manual commit  
  6. 2013-09-25 09:53:13,327 [http-8080-2] DEBUG [org.springframework.jdbc.core.JdbcTemplate] - Executing prepared SQL update  
  7. 2013-09-25 09:53:13,328 [http-8080-2] DEBUG [org.springframework.jdbc.core.JdbcTemplate] - Executing prepared SQL statement [delete from person where id=?]  
  8. 2013-09-25 09:53:13,348 [http-8080-2] DEBUG [org.springframework.jdbc.core.JdbcTemplate] - SQL update affected 1 rows  
  9. 2013-09-25 09:53:13,363 [http-8080-2] DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - Initiating transaction rollback  
  10. 2013-09-25 09:53:13,364 [http-8080-2] DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - Rolling back JDBC transaction on Connection [jdbc:mysql://localhost:3306/mvc?useUnicode=true&characterEncoding=UTF-8, UserName=root@localhost, MySQL-AB JDBC Driver]  
  11. 2013-09-25 09:53:13,377 [http-8080-2] DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - Releasing JDBC Connection [jdbc:mysql://localhost:3306/mvc?useUnicode=true&characterEncoding=UTF-8, UserName=root@localhost, MySQL-AB JDBC Driver] after transaction  
  12. 2013-09-25 09:53:13,378 [http-8080-2] DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] - Returning JDBC Connection to DataSource  


在2013-09-25 09:53:13,363处进行了rollback。

 


 

分享到:
评论

相关推荐

    Spring/SpringMVC/MyBatis整合+事务回滚

    在"Spring/SpringMVC/MyBatis整合+事务回滚"的主题中,我们将深入探讨如何将这三个框架整合起来,并实现事务的回滚功能。 首先,Spring框架是核心,它提供了依赖注入(DI)和面向切面编程(AOP)的能力,使得代码更...

    springMVC+MYBATIS事务管理

    MyBatis本身并不支持事务管理,但它可以与Spring无缝集成,利用Spring的事务管理功能。在MyBatis中,SqlSession对象是进行数据库操作的基本单元,而Spring通过代理方式控制SqlSession的生命周期,从而实现事务管理...

    SpringMvc+Mybatis完整Demo,可用于实际开发

    个人整理的完整的开发框架,完全开源。有任何部署问题可以联系作者:563778000

    springMVC mybatis 学习代码

    - SpringMVC与MyBatis整合后,Spring可以提供声明式事务管理。在配置文件中定义事务管理器,通过@Transactional注解标记在需要事务控制的方法上。 - 事务的隔离级别、回滚规则等都可以在配置文件中设定。 6. **...

    springMVC+mybatis的示例项目

    6. **事务管理**:通过Spring的@Transactional注解,可以在方法级别控制事务的开启、提交、回滚。 **运行示例项目** 下载并解压项目文件后,首先确保已安装好Java环境和Web服务器(如Tomcat)。配置好项目的开发...

    springmvc+mybatis+声明式事务管理

    在SpringMVC+MyBatis的环境中,Spring能够自动管理事务的开始、提交、回滚等操作。例如,当一个方法被标记为`@Transactional`时,Spring会在方法开始时开启一个新的事务,如果方法执行过程中发生异常,事务会被回滚...

    springMVC和mybatis整合,mybatis使用注解模式

    整合SpringMVC和MyBatis的过程中,事务管理也是一个重要环节。Spring提供了PlatformTransactionManager接口来管理事务,通常我们会选择DataSourceTransactionManager,它依赖于DataSource进行事务控制。通过@...

    java-mybatis、springmvc 整合demo源码(druid-demo)

    在"java-mybatis、springmvc 整合demo源码(druid-demo)"中,我们主要探讨的是如何将这两个框架进行无缝集成,并解决在使用@Transactional注解时遇到的事务管理问题。 首先,我们需要了解MyBatis与SpringMVC的整合...

    springMVC+Mybatis 参考资料(一)

    Spring框架提供了SpringMVC和Mybatis的整合方式,如使用Spring的声明式事务管理,可以在Spring配置中统一管理事务的开始、提交、回滚。同时,Spring还可以通过@Autowired注解自动注入Mybatis的Mapper接口,简化了...

    springmvc_mybatis1208

    2. **事务管理**:Spring提供了声明式事务管理,通过`@Transactional`注解,可以在方法级别控制事务的开始、提交、回滚,简化了事务处理。 3. **Mapper接口**:在Spring MVC中,可以使用MyBatis的Mapper接口,通过...

    Spring+SpringMVC+Mybatis框架搭建(含事务管理)

    SSM框架,即Spring、SpringMVC和Mybatis的组合,是Java开发中常见的Web应用程序构建框架。这个框架集合提供了模型-视图-控制器(MVC)架构模式的实现,以及数据库操作的便利性,是企业级应用开发的常用选择。 **...

    SpringMVC +Mybatis完整例子

    在IT行业中,SpringMVC和Mybatis是两个非常流行的开源框架,它们被广泛应用于Java Web开发。SpringMVC作为Spring框架的一部分,负责处理HTTP请求,而Mybatis则是一个优秀的持久层框架,简化了数据库操作。这里我们将...

    springmvc_mybatis3.01.zip_SpringMVC事务_漏洞

    【SpringMVC与MyBatis 3.01集成及事务管理详解】 SpringMVC作为一款优秀的MVC框架,常用于构建Web应用的控制层,而MyBatis则是一款轻量级的持久层框架,专注于SQL映射。将两者集成可以实现灵活的数据访问和高效的...

    学生系统平台的SpringMVC+MyBatis代码

    4. **事务管理**:MyBatis可以集成Spring的事务管理,实现事务的一致性和回滚。 **SpringMVC与MyBatis的整合** 1. **Spring管理MyBatis**:在Spring配置文件中,我们可以定义SqlSessionFactoryBean,通过数据源和...

    springmvc+mybatis 云笔记

    例如,使用`@Transactional`注解标记在Service方法上,Spring会自动管理事务的开启、提交或回滚。 4. **Ajax异步传输**:在云笔记应用中,用户可能需要实时保存或获取笔记,这涉及到大量的Ajax异步请求。SpringMVC...

    springmvc+mybatis+spring注解

    4. **Spring事务管理**:Spring的@Transactional注解可以实现声明式事务管理,即在方法上添加此注解,Spring会自动进行事务的开启、提交、回滚等操作。这使得开发者无需手动管理事务,降低了出错的可能性,也使得...

    SpringMVC-MyBatis入门例子

    SpringMVC和MyBatis结合使用时,Spring负责事务管理。通过@Transactional注解,可以在方法级别声明事务边界,Spring会自动进行事务的开启、提交或回滚。 【日志和调试】 在开发过程中,使用Log4j或Logback记录日志...

    springMVC+MyBatis+Ehcache项目整合

    springMVC+MyBatis+Ehcache项目整合 里面有几个调用的例子 还解决一般行整合出现 MyBatis事物无法回滚问题 Ehcache 以注解的方式进行整合 项目架构一般 不喜欢别骂我 没打算收你们的积分 不要问我叫什么 大家都叫我...

    SpringMVC和Mybatis

    5. **事务管理**:Mybatis可以与Spring集成,进行事务的统一管理和回滚。 **SpringMVC与Mybatis整合** 整合SpringMVC和Mybatis是为了实现更高效的Web应用开发。整合的关键步骤包括: 1. **引入依赖**:在项目中...

Global site tag (gtag.js) - Google Analytics