zoukankan      html  css  js  c++  java
  • @Transaction 无效

    上班的时候碰到这个问题,看了一些博客写的,都试了一遍解决方案,发现结果还是不行,

    最后突然发现我的配置顺序和网上的有些许不同,就改了下,发现成功了,特此打桩纪念一下。

    一、先说一下基本用法:

    1. @Transactional 注解可以标注在类和(Public)方法上,也可以标注在定义的接口和接口方法上。

        不过,Spring建议我们将@Transaction注解在实现类上

        因为注解不能被继承,所以业务接口中标注的@Transactional注解不会被业务实现类继承。所以可能会出现不启动事务的情况。

    2. @Transactional 注解只能应用到 public 可见度的方法上。

        如果应用在protected、private或者 package可见度的方法上,也不会报错,不过事务设置不会起作用。

    3. Spring默认情况下会对运行期例外(RuntimeException)进行事务回滚。这个例外是unchecked,如果遇到checked意外就不回滚。

      如何改变默认规则:

      1) 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)

      2) 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)

      3) 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)

        如果异常被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw RuntimeException}。

    二、解决@Transaction事务不会滚

    1.  检查你方法是不是public的。

    2. 你的异常类型是不是unchecked异常。

    3. 数据库引擎要支持事务,如果是mysql,注意表要使用支持事务的引擎,比如innodb,如果是myisam,事务是不起作用的。

    4. 是否开启了对注解的解析

    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

    5. spring是否扫描到你这个包,如下是扫描到org.test下面的包

    <context:component-scan base-package="com.iyuetest.web" >
         <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
     </context:component-scan>

    6. 以上方法都试遍了还是不行,看了一篇文章说spring加载顺序可能有关,然后我将自己的配置位置调换了一下,就可以用了。

      原本:第一段和第三段是放在spring-db.xml 文件,第二段(需要扫描带注解类的包的配置)在spring-servlet.xml 里

     1     <!-- 事务管理器 -->
     2     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     3         <property name="dataSource" ref="dataSource"/> 
     4     </bean>
     5 
     6 
     7     <!--  需要扫描带注解类的包 -->
     8     <context:component-scan base-package="com.iyuetest.web" >
     9         <!--<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />-->
    10         <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
    11     </context:component-scan>
    12 
    13     <!-- 事务控制 -->
    14     <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

      参考:http://blog.csdn.net/gdfgdfk/article/details/50329859

                  http://blog.csdn.net/qiaoshuai0920/article/details/52125517

                  http://www.cnblogs.com/wuxiaofeng/p/6819209.html

  • 相关阅读:
    vscode安装
    Linux下 Python绘图与可视化 及matplotlib与_tkinter安装
    C语言-结构体定义的几种方式
    leetcode- 88. 合并两个有序数组
    leetcode-16. 最接近的三数之和
    Leetcode-15. 三数之和
    Leetcode-561. 数组拆分 I
    Windows_pycharm下安装numpy
    python实现两个两个的翻转字符串
    linux复制文件夹、重命名文件夹、删除文件夹
  • 原文地址:https://www.cnblogs.com/hxliang/p/7569997.html
Copyright © 2011-2022 走看看