spring mvc与mybatis事务整合

  之前公司用的是mybatis,但事务管理这块是用ejb的CMT容器管理的事务。基本原理是ejb请求进来,业务代码会创建一个mybatis的session然后放入当前线程,之后所有的方法操作涉及到数据库的都从当前线程取session。当所有service层代码完成后,退出ejb时,根据是否有异常来决定是否回退事务,这部分由拦截器来做(回退时,只在事务状态实体上设置rollback为true),等整个ejb退出时,容器再根据标记最终提交或回退事务。

 相比现在公司用的ejb事务,一个请求一个事务,有些场景就不太灵活了,而且还必须用支持ejb的容器,我们用的是jboss。

 

 这几天,将mybatis与mybatis-spring进行结合,用spring来管理事务。发现在整合过程中,碰到了事务不起作用。这里记录下。

 整理步聚如下:

  1.首先需要在maven里引入以下jar:

       
            org.mybatis
            mybatis
            3.2.2
        

     

     spring相关的jar,用的版本是3.0.0.RELEASE

 

  2.接着需要配置事务文件,这里对service层做事务代理,所有除spring mvc Controller中相关的bean定义放在:applicationContext.xml中,如下:

   
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/mvc   
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    
          
    


    

    
    
    
    
        
        
        
        
    

    
    
             class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        
    

    
    
    
        
        
    

    
    
    
        
    

    
    
    
        
    



这里需要特别注意配置中的:

   
          
    


    

  tx:annotation-driver,这个标记,主要是这里用的是注解事务,这个开启后spring会在  "com.video.下面所有类中扫描含有@Transactional的标识,并生成相应的代理(默认是基于接口的JDK动态代理),也可以加上proxy-target-class="true",使用cglib类代理。这时需要加入cglib jar。

      

   这个标记是表示不要扫描spring mvc相关的controller

  spring mvc相关controller实例的扫描生成,由web容器启动时加载webrequest-servlet.xml的内容时进行处理。

 下面是spring mvc组件定义的webrequest-servlet.xml文件

3.webrequest-servlet.xml spring mvc组件文件


    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/mvc   
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
    http://www.springframework.org/schema/context  
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    ">

    
    

    
    
        
    


    
             class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />

    
             class="org.springframework.web.servlet.view.InternalResourceViewResolver"
        p:prefix="/jsp/" p:suffix=".jsp" />


注意这里的:

 
        
    

排除了扫描@service的bean。如果不排除,这里由于web启动时,首先加载这个webrequest-servlet.xml文件,这时将生成一个没有事务的service实例注入到controller。


  所有的配置已经完成,注意上面提到的扫描排除的问题。

你可能感兴趣的:(spring mvc与mybatis事务整合)