zoukankan      html  css  js  c++  java
  • 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】配置出事务方法

         

  • 相关阅读:
    SqlServer查询所有表名 查询表的所有列名
    IIS控制txt文件的访问
    CHM文件打不开
    [转]VS 2010项目中添加lib库
    SqlServer游标
    [转]_beginthread(), _beginthreadex()与CreateThread()的区别
    jquery radio快速度取值
    linx niginx下php无法创建文件夹及文件
    [转载]无效的 CurrentPageIndex 值.它必须大于等于 0 且小于 PageCount
    使用DateGrid的ItemCommand的一点心得
  • 原文地址:https://www.cnblogs.com/_Moliao/p/13507311.html
Copyright © 2011-2022 走看看