• spring事务失效情况分析


    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt113

    <!--[if !supportLists]-->一、<!--[endif]-->声明式事务和注解事务并存的情况下,事务失效。

    该情况常见配置如下:

    <!--事务声明-->

    <bean name="transactionManager"

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

           <property name="dataSource" ref="dataSource"></property>

        </bean>

    <!--声明式事务 –->

    <tx:advice id="txAdvice" transaction-manager="transactionManager">

           <tx:attributes>

               <tx:method name="insert*" propagation="REQUIRED" read-only="false"

                  rollback-for="java.lang.Exception" />

               <tx:method name="save*" propagation="REQUIRED" read-only="false"

                  rollback-for="java.lang.Exception" />

               <tx:method name="update*" propagation="REQUIRED" read-only="false"

                  rollback-for="java.lang.Exception" />

               <tx:method name="modify*" propagation="REQUIRED" read-only="false"

                  rollback-for="java.lang.Exception" />

               <tx:method name="delete*" propagation="REQUIRED" read-only="false"

                  rollback-for="java.lang.Exception" />

               <tx:method name="find*" propagation="SUPPORTS" />

               <tx:method name="get*" propagation="SUPPORTS" />

               <tx:method name="select*" propagation="SUPPORTS" />

           </tx:attributes>

        </tx:advice>

       

        <aop:config>

           <aop:pointcut id="pc"

               expression="execution(* com.suning.sop.*.service.*(..))" />

           <aop:advisor advice-ref="txAdvice" pointcut-ref="pc" />

        </aop:config>

    <!—注解式事务 –->

    <tx:annotation-driven

    proxy-target-class="true"

    transaction-manager="transactionManager"/>

    解决方法:声明优先级,order,值越大优先级越低

    将上例中,<aop:config>节点修改成如下所示

        <aop:config>

           <aop:pointcut id="pc"

               expression="execution(* com.suning.sop.*.service.*(..))" />

           <aop:advisor advice-ref="txAdvice" pointcut-ref="pc" order="1"/>

        </aop:config>

    <!--[if !supportLists]-->二、<!--[endif]-->Controller,Service层和Dao层全部使用注解生成bena,Service层方法也使用注解声明事,这种情况由于 @Controller 会把 关联的@Servie自动实例化,而此时Service层中声明的事务并没有被实例化,导致事务失效。

    解决方法:

    <context:component-scan base-package="com.comtop"  use-default-filters="false" >

            <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>    

    </context:component-scan>    

      

    <context:component-scan base-package="com.comtop">    

            <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>    

    </context:component-scan>   

    Include:把@Controller关联的@Service自动实例化

    exclude:屏蔽@Service自动实例化

    <!--[if !supportLists]-->三、<!--[endif]-->三层都使用注解,事务也使用注解声明。事务失效

    Spring 会先加载声明在xml文件中的Bean

    其次是加载<context:component-scan>标签声明的包中,

    声明了@Controller,@Service,@Component,@Re @Repository的类

    最后是 @Transactional 标记,但上一步处理component-scan 声明的包时,类包含的@Transactional标记没有被处理,所以事务控制失效。

    解决方法:

    Service 层的类使用xml文件声明bean,但是事务控制仍然使用@Transactional注解来声明,事务控制才能生效

  • 相关阅读:
    搭建typescript练习环境
    原有vue项目支持typescript
    express使用session
    express使用cookie
    javascript原型链
    javascript事件循环
    express中间件及body-parser第三方中间件获取post传值
    express路由、静态托管、ejs模板引擎
    nodejs驱动mongodb 实现数据增删改查,将数据库数据渲染在页面,通过表单项数据库新增数据
    柏松分布
  • 原文地址:https://www.cnblogs.com/grefr/p/6095052.html
Copyright © 2020-2023  润新知