• sql server 事务隔离级别


        1.sql server 下一共有6个事务隔离级别

    -- Syntax for SQL Server and Azure SQL Database
      
    SET TRANSACTION ISOLATION LEVEL
        { READ UNCOMMITTED  //读未提交
        | READ COMMITTED    //读提交
        | REPEATABLE READ  //重复读
        | SNAPSHOT      //快照
        | SERIALIZABLE    //可序列化
        | READ COMMITTED SNAPSHOT //读提交的快照
        }

    获取事务隔离级别(isolation level)

    DBCC USEROPTIONS 

      可以看到数据库默认的transaction 级别为 read committed

    设置隔离

    设置回话隔离
    SET TRANSACTION ISOLATION LEVEL <ISOLATION NAME>
    --注意:在设置回话隔离时(REPEATABLE READ)两个单词需要用空格间隔开,但是在表隔离中可以粘在一起(REPEATABLEREAD)
    
    设置查询表隔离
    SELECT ....FROM <TABLE> WITH (<ISOLATION NAME>)

        2.1 read uncommitted 为最低隔离的等级.可以得到没有提交的数据 请看如下的例子

          窗口1:

          

           窗口2:

          

           两个脚本窗口一先执行,窗口2后执行,我们可以看到窗口2 出现了脏读,读到了还没有提交的数据 "11".

        2.2 read committed

          下面引用csdn上的描述

            指定语句不能读取已由其他事务修改但尚未提交的数据。 这样可以避免脏读。 其他事务可以在当前事务的各个语句之间更改数据,从而产生不可重复读取和虚拟数据。 该选项是 SQL Server 的默认设置。

          实际例子如下:

              窗口1:

        

         窗口2:

        

         我们可以看到窗口1的同一个事务中读取同一条数据前后会不一样,导致了  不可重复读取和虚拟数据

        3. repeatable read(重复读)

          指定语句不能读取已由其他事务修改但尚未提交的行,并且指定,其他任何事务都不能在当前事务完成之前修改由当前事务读取的数据。

        只需将 read committed 例子的 isolation level 改为 repeatable read 在执行就可以看出差别.修改等级后,更新操作必须等到第一个事务提交后才可执行

        4.serializeable(可串行的)

      •    语句不能读取已由其他事务修改但尚未提交的数据。

      •   任何其他事务都不能在当前事务完成之前修改由当前事务读取的数据。

      •   在当前事务完成之前,其他事务不能使用当前事务中任何语句读取的键值插入新行。

        

    隔离级别脏读不可重复读虚拟读取
    未提交的读取
    已提交的读取
    可重复的读取
    快照
    可序列化
  • 相关阅读:
    Git使用
    01 Java语法文档
    SpringBoot 02 配置方式
    springMvc10 SSM项目案例==
    ShardingJDBC 实战(史上最全)
    redis cluster 集群 HA 原理和实操(史上最全、面试必备)
    ElasticSearch 深度分页 (史上最全)
    新年又来了!今天是放假的最后前的最后一个工作日!
    记录如何给docker的容器固定ip,方便其他容器进行容器内网ip访问
    如何制定一个高质量的年度规划
  • 原文地址:https://www.cnblogs.com/student-note/p/12386862.html
Copyright © 2020-2023  润新知