zoukankan      html  css  js  c++  java
  • Spring学习(三)

    1,Spring的事务管理机制

    Spring事务管理高层抽象主要包括3个接口,Spring的事务主要是由他们共同完成的:

    l PlatformTransactionManager:事务管理器—主要用于平台相关事务的管理

    l TransactionDefinition: 事务定义信息(隔离、传播、超时、只读)—通过配置如何进行事务管理。

    l TransactionStatus:事务具体运行状态—事务管理过程中,每个时间点事务的状态信息。

    2, PlatformTransactionManager事务管理器

    l DataSourceTransactionManager针对JdbcTemplate、MyBatis 事务控制 ,使用Connection(连接)进行事务控制 :

    开启事务 connection.setAutoCommit(false);

    提交事务 connection.commit();

    回滚事务 connection.rollback();

    l HibernateTransactionManager针对Hibernate框架进行事务管理, 使用Session的Transaction相关操作进行事务控制 :

    开启事务 session.beginTransaction();

    提交事务 session.getTransaction().commit();

    回滚事务 session.getTransaction().rollback();

    事务管理器的选择?

    用户根据选择和使用的持久层技术,来选择对应的事务管理器

    3, TransactionDefinition事务定义信息

    该接口主要提供的方法:

    l getIsolationLevel:隔离级别获取

    l getPropagationBehavior:传播行为获取

    l getTimeout:获取超时时间(事务的有效期)

    l isReadOnly 是否只读(保存、更新、删除—对数据进行操作-变成可读写的,查询-设置这个属性为true,只能读不能写),事务管理器能够根据这个返回值进行优化。

    这些事务的定义信息,都可以在配置文件中配置和定制。

    4, 事务的隔离级别IsolationLevel

    隔离级别

    含义

    DEFAULT

    使用后端数据库默认的隔离级别(spring中的的选择项)

    READ_UNCOMMITED

    允许你读取还未提交的改变了的数据。可能导致脏、幻、不可重复读

    READ_COMMITTED

    允许在并发事务已经提交后读取。可防止脏读,但幻读和 不可重复读仍可发生

    REPEATABLE_READ

    对相同字段的多次读取是一致的,除非数据被事务本身改变。可防止脏、不可重复读,但幻读仍可能发生。

    SERIALIZABLE

    完全服从ACID的隔离级别,确保不发生脏、幻、不可重复读。这在所有的隔离级别中是最慢的,它是典型的通过完全锁定在事务中涉及的数据表来完成的。

    脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据是无效的。

    不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。换句话说就是,后续读取可以读到另一事务已提交的更新数据。相反,“可重复读”在同一事务中多次读取数据时,能够保证所读数据一样,也就是,后续读取不能读到另一事务已提交的更新数据。

    幻读:一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录。

    事务四大特性 ACID ---隔离性引发问题 ---- 解决事务的隔离问题 隔离级别

    Mysql 默认隔离级别 REPEATABLE_READ

    Oracle 默认隔离级别 READ_COMMITTED

    5, 事务的传播行为PropagationBehavior

    什么是事务的传播行为? 有什么作用?

    事务传播行为用于解决两个被事务管理的方法互相调用问题

    业务层两个方法面临的事务问题:

    * 有些时候需要处于同一个事务(删除用户删除完成之后,需要同时删除用户对应的订单,需要事务回滚,例如商场工作人员删除订单业务),

    * 有些时候不能在同一个事务(取款是一个事务操作,打印凭条是一个事务操作,例如ATM取款业务) !

    事务的传播行为的7种类型:

    Propagation

    事务传播行为类型

    说明

    PROPAGATION_REQUIRED

    支持当前事务,如果不存在 就新建一个

    PROPAGATION_SUPPORTS

    支持当前事务,如果不存在,就不使用事务

    PROPAGATION_MANDATORY

    支持当前事务,如果不存在,抛出异常

    PROPAGATION_REQUIRES_NEW

    如果有事务存在,挂起当前事务,创建一个新的事务

    PROPAGATION_NOT_SUPPORTED

    以非事务方式运行,如果有事务存在,挂起当前事务

    PROPAGATION_NEVER

    以非事务方式运行,如果有事务存在,抛出异常

    PROPAGATION_NESTED

    如果当前事务存在,则嵌套事务执行

    只对DataSourceTransactionManager 起效

     

    主要分为三大类:

    //开启事务

    fooa()

    //提交事务

    //开启事务

    foob ()

    //提交事务

    【面试题】REQUIRED、REQUIRES_NEW、NESTED 区分

    REQUIRED:只有一个事务(默认,推荐)

    REQUIRES_NEW:存在两个事务 ,如果事务存在,挂起事务,重新又开启了一个新的事务

    NESTED 嵌套事务,事务可以设置保存点,回滚到保存点 ,选择提交或者回滚,

    6,Spring事务管理的两种方式

    Spring支持两种方式事务管理:

    一,编程式的事务管理

    通过TransactionTemplate手动管理事务

    事务

    二:使用XML或注解配置声明式事务

    Spring的声明式事务是通过AOP实现的(环绕通知),开发中经常使用(代码侵入性最小)推荐使用!!

    XML配置方式添加事务管理(tx、aop元素)

    操作思路:

    1,确定目标:需要对接口中的某个方法,配置切入点

    2,需要Advice(环绕通知),方法前开启事务,方法后提交关闭事务

    3,配置切入点和切面

    配置Advice通知:

    方案一(了解):Spring提供了Around通知类TransactionInterceptor。用来增强bean,spring帮我们写好了一个增强类

    可以配置为:

    <bean id=”transactionInterceptor” class=”org.springframework.transaction.interceptor.TransactionInterceptor”>

    事务2

    方案二(掌握):但Spring为简化事务的配置,提供了<tx:advice>来代替上面的配置,也可以理解为该标签是spring为你实现好了的事务的通知增强方案。

    com.springsource.org.aopalliance-1.0.0.jar:aop切面编程

    com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar:注解开发切面

    spring-aop-3.2.0.RELEASE.jar:aop切面编程

    spring-aspects-3.2.0.RELEASE.jar:注解开发切面

    spring-tx-3.2.0.RELEASE.jar:事务处理

    事务3

    XML配置方式和注解配置方式 进行事务管理 哪种用的多?

    XML方式,集中式维护,统一放置到applicationContext.xml文件中,缺点在于配置文件中的内容太多。

    使用@Transactional注解进行事务管理,配置太分散,使用XML进行事务管理,属性集中配置,便于管理和维护

  • 相关阅读:
    串口数据字节位的理解
    【转】arm-none-linux-gnueabi-gcc下载
    【转】网络排错全面详解
    【转】VMware虚拟机三种网络模式详解
    【转】vi编辑只读文档无法保存的解决办法
    【转】关于在linux下清屏的几种技巧
    【转】64位Ubuntu 16.04搭建嵌入式交叉编译环境arm-linux-gcc过程图解
    ELF文件
    UCOSII内核代码分析
    vmware安装win7提示No CD-ROM drive to use:GCDROM not loaded
  • 原文地址:https://www.cnblogs.com/lizhaowen/p/6057618.html
Copyright © 2011-2022 走看看