@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

原文地址:https://www.cnblogs.com/hxliang/p/7569997.html