Spring事务管理操作,机制,特性,隔离级别

1:认识事务

可以把一系列要执行的操作称为事务,而事务管理就是管理这些操作要么完全执行要么完全不执行(很经典的一个例子是:A要给B转钱,首先A的钱减少了,但是突然的数据库断电了,导致无法给B加钱,然后由于丢失数据,B不承认收到A的钱;在这里事务就是确保加钱和减钱两个都完全执行或完全不执行,如果加钱失败,那么不会发生减钱)。

事务管理的意义:保证数据操作的完整性。一致性

事务管理的四大特性: - 记住ACID

原子性:事务的整个操作是一个整体,不可以分割,要么全部成功,要么全部失败。

一致性:事务操作的前后,数据表中的数据没有变化。

隔离性:事务操作是相互隔离不受影响的。

持久性:数据一旦提交,不可改变,永久的改变数据表数据。

事务管理操作:

开启事务管理:开启之后,下面的sql语句并不会马上执行并把结果写到表中,而是会写到事务日志中。

start transaction;

回滚操作:会清掉开始事务管理之后写到事务日志中的内容,即恢复到开启事务管理之前。

语法:rollback; - 如果程序发生了异常,将数据恢复到没有操作之前的那个状态。

注意:回滚操作只是回退"写"的内容,对于普通的读表select语句不能回退。

事务提交:将sql语句的结果写到数据表中。

语法:commit: - 持久化的保存

当 commit 或 rollback 语句执行后,事务会自动关闭

2: Spring事务管理机制

 

Spring事务管理 由三个接口共同完成 :

l  PlatformTransactionManager 平台相关事务管理器  - 事务管理器

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

l  TransactionStatus 事务状态 (事务管理过程中,每个时间点事务 状态信息 )

1.1.  PlatformTransactionManager 事务管理器

 

 

提交事务 commit、回滚事务 rollback、 获取事务状态 getTransaction

 

l  DataSourceTransactionManager 针对 JdbcTemplate、MyBatis 事务控制 ,使用Connection进行事务控制

开启事务 conn.setAutoCommit(false);  //  conn - 链接的事务管理

提交事务 conn.commit();

回滚事务 conn.rollback();

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

开启事务 session.beginTransaction(); 

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

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

 

1.1.  TransactionDefinition 事务定义信息

 

隔离级别获取 getIsolationLevel 、 传播行为获取 getPropagationBehavior 、 获取超时时间getTimeout 、isReadOnly 是否只读  

 事务的隔离级别

 

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

      Mysql 默认隔离级别 REPEATABLE_READ ,

      Oracle 默认隔离级别 READ_COMMITTED

1.1.1.    事务的传播行为

什么是事务的传播行为? 为什么需要 ?

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

 

REQUIRED、SUPPORTS、MANDATORY : 支持当前事务, A调用B,如果A事务存在,A和B处于同一个事务 (事务默认传播行为 REQUIRED )

      REQUIRES_NEW、NOT_SUPPORTED、NEVER : 不会支持原来的事务 ,A调用B, 如果A事务存在, B肯定不会和A处于同一个事务

      NESTED: 嵌套事务 ,只对DataSourceTransactionManager有效 ,底层使用JDBC的SavePoint机制,允许在同一个事务设置 保存点,回滚保存点

 

面试题:REQUIRED、REQUIRES_NEW、NESTED 区分

       REQUIRED 一个事务

       REQUIRES_NEW 两个事务

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

 TransactionStatus 事务状态

 

 

事务运行过程中,每个时间点 事务状态信息 !

事务的结束必须通过commit , rollback 作用标记为回滚

      try {

           操作

commit

      } catch (){

           rollback

      }

 

三个对象之间的关系:

      用户管理事务,需要先配置事务管理方案  TransactionDefinition、 管理事务通过TransactionManager 完成,TransactionManager根据 TransactionDefinition进行事务管理,在事务运行过程中,每个时间点都可以通过获取TransactionStatus 了解事务运行状态!

3: Spring事务管理两种方式

Spring支持两种事务管理: 编程式事务管理、 声明式事务管理

l  编程式事务管理: 要修改原来的代码,加入事务管理代码 (侵入性 )--- 不推荐,不使用

实际中是通过TransactionTemplate 操作事务管理

      template.execute(new TransactionCallbackWithoutResult(){

           void doInTransactionWithoutResult(TransactionStatus status) {

                 // 需要事务管理的代码

        }

});

l  声明式事务管理: 底层就是AOP的环绕通知, --- 推荐

4: 声明式事务管理案例 

1.1.  编写转账案例,引出事务管理问题

第一步:建立数据表

第二步: 编写转账代码

第三步: 编写测试

1.2.  XML配置方式添加事务管理(tx、aop约束)

第一步: 引入aop和tx 的名称空间,导入aop和tx 的jar

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx.xsd">

第二步: 配置 transactionManager(spring提供 Around 通知 )

根据不同的持久层框架,配置不同的事务管理器,事务管理器需要依赖数据源信息

第三步: 配置切入点和切面

1、在spring的配置文件中,使用<tx:advice>配置通知信息,其实就是哪些需要方法需要增强,事务管理也是aop的应用

<tx:advice id=”xx” dataxxx>

        <tx:attributes>

            <tx:method name="具体的方法名"/>

        </tx:attributes>

    </tx:advice>

2、使用aop:config来配置切入点和切面信息

aop:pointcut 配置切入点, id=""起个名字,   expression="" 配置切入点表达式

aop:advisor 配置切面,advice-ref="" pointcut-ref=""  将切入点和通知整合到一起

 

 

1.1.  注解配合方式添加事务管理 @Transactional

只需要配置一个事务管理器即可,其他的都不需要

第一步: 配置注解驱动事务管理 ,<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>

第二步: 在需要管理事务的方法或者类上面 添加@Transactional 注解

注意:一定要开启注解驱动,否则注解不能被识别

 

小结:

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

      XML方式 和注解都在使用

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

 

 

posted @ 2022-02-16 22:11  这题我不会  阅读(93)  评论(0)    收藏  举报