• 事务的传播性和隔离性


    一、事务的传播性

    1、PROPAGATION_REQUIRED:

        支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
    2、PROPAGATION_SUPPORTS:

        支持当前事务,如果当前没有事务,就以非事务方式执行。
    3、PROPAGATION_MANDATORY:

        支持当前事务,如果当前没有事务,就抛出异常。


    4、PROPAGATION_REQUIRES_NEW :

         新建事务,如果当前存在事务,把当前事务挂起。
    5、PROPAGATION_NOT_SUPPORTED :

        以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    6、PROPAGATION_NEVER :

        以非事务方式执行,如果当前存在事务,则抛出异常。
    7、PROPAGATION_NESTED:

        如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

      备注:

      PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED 的区别:

      PROPAGATION_REQUIRES_NEW 完全是一个新的事务, 而 PROPAGATION_NESTED 则是外部事务的子事务, 如果外部事务 commit, 潜套事务也会被 commit, 这个规则同样适用于 roll back.

    二、事务的隔离性

    1、数据隔离级别分为不同的4种:

      SERIALIZABLE

        最严格的级别,事务串行执行,资源消耗最大。

      REPEATABLE_READ

        保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。

      READ_COMMITTED

        大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。该级别适用于大多数系统。

      READ_UNCOMMITTED

        保证了读取过程中不会读取到非法数据。

    2、其中涉及到几个术语

      脏读(Dirty Reads)

        所谓的脏读,其实就是读到了别的事务回滚前的脏数据。比如事务B执行过程中修改了数据X,在未提交前,事务A读取了X,而事务B却回滚了,这样事务A就形成了脏读。

      不可重复读(Non-RepeatableReads)

        不可重复读字面含义已经很明了了,比如事务A首先读取了一条数据,然后执行逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时候,发现数据不匹配了,就是所谓的不可重复读了。

      幻读

        小的时候数手指,第一次数十10个,第二次数是11个,怎么回事?产生幻觉了?

        幻读也是这样子,事务A首先根据条件索引得到10条数据,然后事务B改变了数据库一条数据,导致也符合事务A当时的搜索条件,这样事务A再次搜索发现有11条数据了,就产生了幻读。

    3、事务隔离级别对照关系表:

    隔离级别 脏读 不可重复读 幻读
    SERIALIZABLE
    REPEATABLE_READ 对共享锁的占用时间较长(两次查询),会一直持续到事务的结束,查询共享锁(S),更新排它锁(X)
    READ_COMMITTED 对应查询数据的请求需要先请求共享锁定,由于锁之间的兼容性,造成阻塞,更新排它锁(X),查询共享锁(S)。先查询没结束,在插入也会阻塞
    READ_UNCOMMITTED  
    就sqlserver数据库而言,每一条语句在默认事务级别下(可提交读级别)都是加锁的
    如一条普通的查询,要加S锁(共享),一个更新要加U锁(更新)等等
    你说的表锁、行锁只是锁的粗粒程度,如字面意思,行锁是锁住几行,表锁就是锁住整个表所在的全部数据页




    事务有三种模型:
    1.隐式事务是指每一条数据操作语句都自动地成为一个事务,事务的开始是隐式的,事务的结束有明确的
    标记
    2.显式事务是指有显式的开始和结束标记的事务,每个事务都有显式的开始和结束标记,锁的生成与隔离级别有关。
    3.自动事务是系统自动默认的,开始和结束不用标记。
     
    https://blog.csdn.net/aluomaidi/article/details/52460844
    https://www.cnblogs.com/retop/p/7073432.html
    爱码久成癖,得山真隽永
  • 相关阅读:
    英语中的一个月几天的表示法
    深圳梧桐山游记
    linux中创建文件和文件夹
    linux中~和/的区别
    linux中的--和-的区别
    linux中vi和vim的区别
    基本数据类型大小和范围
    洛谷 [AHOI2001]质数和分解
    codevs 1115 开心的金明--01背包
    codevs 1080 线段树练习--用树状数组做的
  • 原文地址:https://www.cnblogs.com/pinenut/p/7151529.html
Copyright © 2020-2023  润新知