zoukankan      html  css  js  c++  java
  • Transaction 事务回滚无效,常见原因!!!

    今天使用@Transcation注解的形式为serivce服务添加事物,但是无论如何都无法回滚!

    在网上找了很多帖子,自己总结了一下.

    开始说事务之前,不得不提一下java的异常类型:

    分为checked异常和unchecked异常

    checked异常:非系统原因造成的异常,比如需要Try - catch处理,或者throws抛出到上一层去,继承自java.lang.Exception(不包括java.lang.RuntimeException)

    unchecked异常:系统原因自己造成的异常,如空指针异常,类型转换异常等,不需要在系统中显示的捕获处理。继承自java.lang.RuntimeException

    下面是注解形式的事物在Spring中的配置

        <bean id="transactionManager"
            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource" />
        </bean>
        
          <bean id="transactionTemplate"  
            class="org.springframework.transaction.support.TransactionTemplate">  
            <property name="transactionManager" ref="transactionManager"></property>  
          </bean>
        
        <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class = "true" />

    @Transaction(propagation=Propagation.NOT_SUPPORTED)

    Propagation支持7种不同的传播机制:

    REQUIRED:如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。

    SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器,PROPAGATION_SUPPORTS与不使用事务有少许不同。

    NOT_SUPPORTED:总是非事务地执行,并挂起任何存在的事务。

    REQUIRESNEW:总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。

    MANDATORY:如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

    NEVER:总是非事务地执行,如果存在一个活动事务,则抛出异常

    NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。

    事物无效的原因:

    1.@Transactional 注解必须作用在public的权限管理上,其余的权限管理关键字并不会使事物生效

    2.<tx:annotation-driven transaction-manager="transactionManager" /> 如果缺少了这一块配置 那么事物的注解也会失效

    3.通过元素的 “proxy-target-class” 属性值来控制是基于接口的还是基于类的代理被创建。如果 “proxy-target-class” 属值被设置为 “true”,那么基于类的代理将起作用。

       如果 “proxy-target-class” 属值被设置为 “false” 或者这个属性被省略,那么标准的JDK基于接口的代理将起作用。

    4.Spring团队建议在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上.

       在接口上使用 @Transactional 注解,只能当你设置了基于接口的代理时它才生效(即配合proxy-target-class为true)

    5.@Transactional 的事务开启 ,或者是基于接口的 或者是基于类的代理被创建。在同一个类中一个方法调用另一个方法有事务的方法,事务是不会起作用的。

    6.在web项目中往往都会配置spring容器与spring-mvc子容器,所以想让事物在service中生效必须要区分2个容器的扫描对象,mvc就针对controller层扫描,其余的交给spring去控制

       如果在mvc扫描所有的对象包括serivce,那么事物也会失效,所以2个容器的对象管理最好做下区分

  • 相关阅读:
    【Linux编程基础】构建Linux 库文件
    【Linux调试技术】查看数据
    【C++学习】复制构造函数和赋值运算符根本的不同
    【C++学习】显式构造函数
    【C++学习】函数对象和Lambda表达式
    【C++学习】类初始化列表的分析总结
    【Linux开发基础】Linux守护服务进程(Daemon service)编程
    【编程小结】C++和Java 的缺省初始化问题
    SQL查询金额去掉小数点后面的零
    SQL自定义函数split 将数组(分隔字符串)返回阵列(表)
  • 原文地址:https://www.cnblogs.com/culushitai/p/9205036.html
Copyright © 2011-2022 走看看