zoukankan      html  css  js  c++  java
  • spring的声明式事务和编程式事务

    事务管理对于企业应用来说是至关重要的,当出现异常情况时,它可以保证数据的一致性.

    Spring事务管理的两种方式

    1.编程式事务 使用Transaction Ttempleate或者直接使用底层的Platform TransactionManager.对于编程式事务管理,spring推荐使用Transaction Template

      简单的说就是在代码中需要直接加入处理事务的逻辑,可能需要在代码中显式调用begin Transaction() commit(). rollback() 等事务管理相关的方法,如在执行a方法的时候需要事务处理,你需要在a方法开始时候开启事务,处理完成之后,在方法结束的时候,关闭事务.

    2.声明式事务 建立在AOP之上的,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务,声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需要在配置文件中做相关的事务规则声明(或通过基于@Transaction注解的方式),便可以将事务规则应用到业务逻辑中.

      显然声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式.声明式事务管理使业务代码不受污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持.和编程式事务相比,声明式事务唯一不足的地方是,它的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别.但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法等等.

      声明式事务管理也有两种常用的方式,一种是基于tx和aop名字的xml配置文件,另一种就是基于@Transaction注解.显然基于注解的方式更简易.更清爽.

    以Mybatis为例,基于注解的声明式事务配置

      1.添加tx名字空间

    xmlns:tx="http://www.springframework.org/schema/tx"

     2.开启事务的注解支持

    <!-- 开启事务控制的注解支持 -->  
    <tx:annotation-driven transaction-manager="transactionManager"/>

    3、MyBatis自动参与到spring事务管理中,无需额外配置,只要org.mybatis.spring.SqlSessionFactoryBean引用的数据源与DataSourceTransactionManager引用的数据源一致即可。

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
        <property name="dataSource" ref="dataSource" />  
        <property name="configLocation">  
            <value>classpath:mybatis-config.xml</value>  
        </property>  
    </bean> 
    
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
        <property name="dataSource" ref="dataSource" />  
    </bean> 

    使用@Transactional注解

    @Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该注解来覆盖类级别的定义。

    虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。

  • 相关阅读:
    用mobiscroll.js如何简单使用日期控件
    Easyui的datagrid的行编辑器Editor中添加事件(修改某个单元格带出其他单元格的值)
    运行网站项目时,有时出现Bad Request,该怎么解决?
    Easyui的datagrid的editor(行编辑器)如何扩展datetimebox类型
    JQuery对象和DOM对象的区别与转换
    【转发】Cookie存储的值大小限制和个数问题
    【转发】centos 7开启FTP以及添加用户配置权限,只允许访问自身目录,不能跳转根目录
    Vim 保存和退出命令
    CentOS下防御或减轻DDoS攻击方法(转)
    CentOS 7 firewalld vsftpd开放端口
  • 原文地址:https://www.cnblogs.com/qingmuchuanqi48/p/10922445.html
Copyright © 2011-2022 走看看