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

  • 相关阅读:
    JDBC 复习4 批量执行SQL
    JDBC 复习3 存取Oracle大数据 clob blob
    Oracle复习
    Linux命令(1)grep
    JDBC 复习2 存取mysql 大数据
    JDBC 复习1 DBUtil
    php 环境搭建问题
    Windows 批处理 bat 开启 WiFi 菜单选项 设置ID PWD
    Bat 批处理启动和停止Oracle 服务
    docker 学习1 WSL docker ,Windows docker
  • 原文地址:https://www.cnblogs.com/hxliang/p/7569997.html
Copyright © 2011-2022 走看看