zoukankan      html  css  js  c++  java
  • Spring:Spring事务的4种特性、5种隔离级别、7种传播特性

    此文章只作笔记记录,不作为讲解文章

    1. 事务的特性(4种)

    原子性 (atomicity):强调事务的不可分割.
    一致性 (consistency): 事务的执行的前后数据的完整性保持一致.
    隔离性 (isolation): 事务执行的过程中, 不受其他事务的干扰, 即并发执行的事物之间互不干扰
    持久性(durability) : 事务一旦结束, 数据就持久到数据库

    2. 事务诱发的问题

    2.1 脏读

     事务A读到了事务B的已操作但未提交的数据.

    2.2 不可重复读

     事务A有多次查询,第一次读取数据后继续运行,第二次读到了事务B已经提交的 update 的数据导致 事务A 内的多次查询结果不一致.

    2.3 幻读

     事务A有多次查询,第一次读取数据后继续运行,第二次读到了事务B已经提交的 insert ( delete )的数据导致 事务A 内的多次查询结果不一致.

    2.4 事务丢失( 回滚丢失 )

     事务A运行增删改操作后( 还未提交 ),事务B也运行增删改操作并提交,事务A继续运行后报错进行事务回滚时,此时就会把事务B的操作清除掉。

    2.5 事务丢失( 提交丢失 )

    事务A与事务B同时对一组数据运行增删改操作,事务B先一步提交事务,事务A继续运行后也提交事务,此时就会把事务B的操作清除掉。

    3. 数据库的事务隔离级别(4种)

    部分数据库的默认事务隔离级别为 已提交读 ;例:SQL Server、Oracle

    Mysql的默认事务隔离级别为:可重复读

    4. 事务的隔离级别(5种)

    4.1 ISOLATION_DEFAULT 

      使用数据库默认的隔离级别

    4.2 ISOLATION_READ_UNCOMMITTED 

      事务最低的隔离级别 ( 可能会导致 脏读,不可重复读,幻读 )

    4.3 ISOLATION_READ_COMMITTED

      保证一个事务修改的数据提交后才能被另外一个事务读取 ( 可能会导致 不可重复读,幻读 )

    4.4 ISOLATION_REPEATABLE_READ

      保证一个事务修改的数据提交后才能被另外一个事务读取 ( 可能会导致 幻读 )

      保证一个事务读取数据后,另外一个事务才能修改 ( 可能会导致 幻读 )

    4.5 ISOLATION_SERIALIZABLE

       这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行 ( 执行效率最慢 )

    5. 事务的传播特性(7种)

      ( 事务嵌套调用问题 ) 当事务方法A内部调用事务方法B时,子事务方法B出现事务报错,其父事务方法A是否回滚事务、事务报错、正常运行?

    注:如下所有配置特性都是作用在子事务方法B的。

    第一类:父事务方法有事务时,支持父事务方法

    5.3 Propagation.SUPPORTS

    父方法A没有标注事务时,子事务方法B按照非事务的方法运行(报错不回滚);父事务方法A标注事务时,子事务方法B绑定父事务方法A的事务一起运行、回滚、提交、报错。

    5.6 Propagation.REQUIRED

    父方法A没有标注事务时,子事务方法B新建事务自运行;父事务方法A标注事务时,子事务方法B与父事务方法A的事务合并运行无论哪个事务出错都一起回滚、或者一起提交。

    5.7 Propagation.MANDATORY

    父方法A没有标注事务时,子事务方法B报错抛出异常;父事务方法A标注事务时,子事务方法B绑定父事务方法A的事务一起运行、回滚、提交、报错。

    第二类:父事务方法有事务时,隔离父事务方法另辟新事务运行或者直接报错

    5.1 Propagation.NEVER

    父方法A没有标注事务时,子事务方法B正常运行事务;父事务方法A标注事务时,子事务方法B直接报错。

    5.2 Propagation.NOT_SUPPORTED

    父方法A没有标注事务时,子事务方法B按照非事务的方法运行(报错不回滚);父事务方法A标注事务时,子事务方法B把父事务方法A挂起,然后子事务方法B按照非事务的方法运行(报错不回滚),之后子事务方法A继续运行自己的事务。

    5.4 Propagation.REQUIRES_NEW

    父方法A没有标注事务时,子事务方法B新建事务自运行;父事务方法A标注事务时,子事务方法B把父事务方法A挂起,然后子事务方法B新建事务自运行。( 子事务与父事务隔离运行,互不干涉 )

    5.5 Propagation.NESTED

    父方法A没有标注事务时,子事务方法B新建事务自运行;父事务方法A标注事务时,子事务方法B回滚时不影响父事务方法A流程,但父事务方法A回滚时会一并回滚子事务方法B的所有操作。

    ----------------------------------- 作者:怒吼的萝卜 链接:http://www.cnblogs.com/nhdlb/ -----------------------------------
  • 相关阅读:
    关于String重写的hashcode的代码分析
    自定义HashSet判重标准
    idea-Java文件结构
    java 带静态域的导出类创建时都发生了什么?
    seo初学
    关于事件冒泡和事件委托
    关于本地$.get(url,function(data)),异步获取数据
    FileReader上传图片
    关于随机生成颜色
    C语言贪吃蛇
  • 原文地址:https://www.cnblogs.com/nhdlb/p/15230661.html
Copyright © 2011-2022 走看看