• spring+springMVC+Mybatis 中使用@Transcational方式管理事务的配置方法


    springMVC 中,事务通常都在service层控制,当然controller层也可以用事务,只要配置配对,但通常不建议直接在controller层配事务,controller的作用是管理参数以及做一些简单的逻辑,业务都放在service层会比较规范。 所以这里只讨论service层的事务配置问题。以下是转载自这里的文章:

    http://www.cnblogs.com/flying607/p/4821397.html

    这位哥写的例子非常正面:

    spring中管理事务的配置方式除了@Transcational还有使用aop等,本文介绍@Transcational方式,但是推荐使用aop方式。因为如果有多个事务管理器的话,你在注解中还需要注明使用哪个事务管理器@Transactional("transactionManager1")。

    一、spring中一定要记得加载所有需要的bean

    如果使用注解方式的话一定要记得扫描注解,下边的例子表示扫描xxx.xxx下所有文件(包含每一级子文件夹)中除了@Controller以外的所有注解。

    <context:component-scan base-package="xxx.xxx">
      <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>

    二、而springmvc中则只扫描controller

    <context:component-scan base-package="xxx.xxx" use-default-filters="false" >
            <context:include-filter type="annotation"
                expression="org.springframework.stereotype.Controller" />
        </context:component-scan>

    既然是只扫描,那么默认扫描的那些东西都要去掉。总之如果使用context:include-filter(注意上边两段写的分别是include和exclude),则一定不要忘记use-default-filters="false"。

    三、spring中其它要配的除了数据源外必须还有这些:

        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource" />
        </bean>
        <!-- 使用annotation注解方式配置事务 -->
        <tx:annotation-driven transaction-manager="transactionManager"  />
    transactionManager中的dataSource是告诉事务管理器,调用哪个数据库的commit和rollback

    tx:annotation-driven则是为所有已经加载(步骤一 中 的扫描就是加载过程)进spring的,且有@Transcational注解的bean交给transaction-manager中所写的事务管理器来管理事务。如果想指定用哪个事务管理器就可以在注解中写了,例如@Transactional("transactionManager1")
    
    
    四、其中关于use-default-filters的解释,请看涛哥的一篇文章,里面写得非常清楚。http://jinnianshilongnian.iteye.com/blog/1762632
    
    
    五、另一个问题:上面涛哥的文章中也提到,就是事务不生效的问题。原因:

    如果在springmvc配置文件,不使用cn.javass.demo.web.controller前缀,而是使用cn.javass.demo,则service、dao层的bean可能也重新加载了,但事务的AOP代理没有配置在springmvc配置文件中,从而造成新加载的bean覆盖了老的bean,造成事务失效。只要使用use-default-filters=“false”禁用掉默认的行为就可以了。

    六、再探讨一下@Transactional注解找到/找不到事务的问题。实际上@Transactional会找到我们在容器配置的事务管理器,如果容器中配置了两个事务管理器,比如是transactionManager1 和 transactionManager2 。那么注解就要变为:@Transactional("transactionManager1")或者 @Transactional("transactionManager2"),如果只是@Transactional ,那么名字默认是transationManager 。如果我们并没有在spring容器中配置上面第三点中的事务管理器,那么@Transactional的时候就找不到事务管理器,事务不会生效。同样道理,通常我们不会在spring-mvc的配置文件中配置事务管理器,所以在Controller层添加@Transactional也不会生效。如果想在Controller层启用事务,除了需要加@Transactional到Controller层,还需要在spring-mvc的配置文件中添加上面第三点中的事务管理器的配置。

  • 相关阅读:
    监控注册表和文件夹改动
    Windows中根据GetLastError的错误代码,取得文字描述
    VBA 读取文件/写入文件
    (转)ansi,gb2312,gbk,gb18030,unicode,utf8,unicode big endian编码的区别及什么是BOM
    VBA 打开文件对话框
    修改GitHub记录中的invalidemailaddress
    使用DWM实现Aero Glass效果
    RAII(C++必知必会 条款40)
    C函数包装ASM代码时,指针无法传值的问题
    msysgit color.ui auto is invalid msysgit无法开启彩色显示
  • 原文地址:https://www.cnblogs.com/haw2106/p/10060040.html
Copyright © 2020-2023  润新知