• Spring 笔记三 事务


    一、环境搭建

      【1】导包

      【2】编写配置文件

        1. 配置扫描注解

        2. 引入外部资源文件

        3. 配置数据源

        4. 配置JdbcTemplate 操作数据库

        5. 配置声明式事务

          5.1 Spring 提供了事务管理器,先配置管理器。DataSourceTransactionManager。

          5.2 控住数据源

          

          5.3 开启基于注解的声明式事务。依赖 tx 名称空间。

          

          5.4 给事务方法加注解。@Transactional

      【3】测试

    二、@Transactional 注解

      

      timeout-int(秒为单位):超时,事务超出指定执行时长后自动终止并回滚;

      readOnly-boolean:设置事务为只读事务;可以进行事务优化;readOnly=true:加快查询速度;不用管事务那一堆操作了。

      isolation-Isolation:事务的隔离级别;

      propagation-Propagation:事务的传播行为;

      noRollbackFor:哪些异常事务可以不回滚;(可以让原来默认回滚的异常给他不回滚);

      rollbackFor:原本不回滚(原本编译时异常是不回滚的)的异常指定让其回滚。

      小知识:异常的分类:

        【1】运行时异常:可以不用处理,默认都回滚。

        【2】编译时异常:要么 try-catch,要么在方法声明上 throws,默认不会滚。

    三、隔离级别

      【1】数据库事务并发问题:假设现在有两个事务:Transaction01和Transaction02并发执行。  

      ① 脏读

        [1]Transaction01将某条记录的AGE值从20修改为30。

        [2]Transaction02读取了Transaction01更新后的值:30

        [3]Transaction01回滚,AGE值恢复到了20。

        [4]Transaction02读取到的30就是一个无效的值。

      ② 不可重复读

        [1]Transaction01读取了AGE值为20。

        [2]Transaction02将AGE值修改为30。

        [3]Transaction01再次读取AGE值为30,和第一次读取不一致。

      ③ 幻读

        [1]Transaction01读取了STUDENT表中的一部分数据。

        [2]Transaction02向STUDENT表中插入了新的行。

        [3]Transaction01读取了STUDENT表时,多出了一些行。

      【2】隔离级别

        数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题。一个事务与其他事务隔离的程度称为隔离级别SQL标准中规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。  

        ①读未提交:READ UNCOMMITTED

          允许Transaction01读取Transaction02未提交的修改。

        ②读已提交:READ COMMITTED

          要求Transaction01只能读取Transaction02已提交的修改。

        ③可重复读:REPEATABLE READ

          确保Transaction01可以多次从一个字段中读取到相同的值,即Transaction01执行期间禁止其它事务对这个字段进行更新。

        ④串行化:SERIALIZABLE(一万年用不到

          确保Transaction01可以多次从一个表中读取到相同的行,在Transaction01执行期间,禁止其它事务对这个表进行添加、更新、删除操作。可以避免任何并发问题,但性能十分低下。

      【3】在 mysql 下演示隔离级别

        1. 几个和隔离级别相关的命令

          1.1 查询隔离级别

            ① 查询当前会话的隔离级别

            SELECT @@session.tx_isolation;

            SELECT @@tx_isolation;

            @ 查询全局的隔离级别

            SELECT @@global.tx_isolation;

          1.2 修改隔离级别

          SET  [ SESSION  |  GLOBAL ]   TRANSACTION    ISOLATION   LEVEL   {READ    UNCOMMITTED   |   READ    COMMITTED   |   REPEATABLE    READ  |  SERIALIZABLE} ;

          例如:将当前会话的隔离级别改为读未提交:SET   SESSION   TRANSACTION   ISOLATION   LEVEL   READ   UNCOMMITTED;

          1.3 事务操作

          开启事务:start transaction;
          提交事务:commit;
          回滚事务:rollback;

        2. 读未提交

          

        3. 读已提交

          

        4. 可重复读

          

    四、传播行为(propagation:传播

        传播行为:事务的传播+事务的行为,如果有多个事务进行嵌套运行,子事务是否要和大事务共用一个事务。

        事务传播属性可以在@Transactional 注解的 propagation 属性中定义,Spring 定义了 7 中传播行为。

        

    五、基于 XML 配置的事务

        基于 xml 配置的事务;依赖 tx 名称空间和 aop 名称空间。

      【1】Spring中提供事务管理器(事务切面),配置这个事务管理器。

        

      【2】告诉 Spring 哪些方法是事务方法(事务切面按照我们的切入点表达式去切入事务方法)

        

      【3】配置出事务方法

         

  • 相关阅读:
    Two Sum II
    Subarray Sum
    Intersection of Two Arrays
    Reorder List
    Convert Sorted List to Binary Search Tree
    Remove Duplicates from Sorted List II
    Partition List
    Linked List Cycle II
    Sort List
    struts2结果跳转和参数获取
  • 原文地址:https://www.cnblogs.com/_Moliao/p/13507311.html
Copyright © 2020-2023  润新知