• SQL92 隔离级别理解和测试


      以前对数据库的隔离级别,有所了解,但不知道真正其中的区别。今天就讨论一下这4个隔离级别

      下面是4个隔离级别,在SQL server 2005里的介绍

    READ UNCOMMITTED
          指定语句可以读取已由其他事务修改但尚未提交的行。
    READ COMMITTED
         指定语句不能读取已由其他事务修改但尚未提交的数据。这样可以避免脏读。其他事务可以在当前事务的各个语句之间更改数据,从而产生不可重复读取和幻像数据
    REPEATABLE READ

        其他事务可以插入与当前事务所发出语句的搜索条件相匹配的新行。如果当前事务随后重试执行该语句,它会检索新行,从而产生幻读

    SERIALIZABLE

         范围锁处于与事务中执行的每个语句的搜索条件相匹配的键值范围之内。这样可以阻止其他事务更新或插入任何行 

    建立环境:

     create table t_emp(id numeric(10)
      ,name varchar(
    10),
    salary numeric(
    10,2));

      插入数据:

    insert into t_emp values(1,'jack',10000.50);
    insert into t_emp values(
    2,'jack2',8000.50);
    insert into t_emp values(
    3,'jack3',120000);
    insert into t_emp values(
    4,'jack4',5000);
    insert into t_emp values(
    5,'jack5',3000);

    脏读

       如果一个事务在提交操作结果之前,另一个事务可以看到该结果,就会发生这种情况

      测试语句一:

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    begin tran
         select 
    * from  dbo.t_emp where id=1

      测试语句二:

     

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    begin tran
         update t_emp 
    set name='zping.com' where id=1

       这时在两个窗体间执行,在一中可以看到,二中未提交的数据。

    不可重复读(也称为模糊读 (Fuzzy Read))

       如果一个事务在提交结果之前,另一个事务可以修改和删除它

      显示例子:

    SET TRANSACTION ISOLATION LEVEL READ COMMITTED

    begin tran
         
    select * from  dbo.t_emp where id=1 waitfor delay '00:00:03'
         
    select * from  dbo.t_emp where id=1

      

    SET TRANSACTION ISOLATION LEVEL READ COMMITTED

    begin tran
        
    --1,insert into t_emp values(1,'33',434)
        --2,delete  t_emp where id=1
        
    --3;update t_emp set name='fff' where id=1

        --4;update t_emp set id=1 where id=2
      commit

        一个事务读取数据后,另一个事务修改第一个事务读取当前结果,情况如下:

           对应1,增加一条“id=1”的记录。

           对应2,将"id=1"的数据记录删除。

           对应2,修改结果“id=1"记录其他列的信息。

           对应3,修改数据”id=2“的数据为”id=1“的记录。

        这时是看不到事务未提交的数据的。

    幻像读

       如果一个事务在提交查询结果之前,另一个事务可以更改该结果

     测试例子:

    SET TRANSACTION ISOLATION LEVEL  REPEATABLE READ

    begin tran
    select * from  dbo.t_emp waitfor delay '00:00:03'
    select * from  dbo.t_emp

    SET TRANSACTION ISOLATION LEVEL  REPEATABLE READ

    begin tran
      insert into t_emp values(1,'33',434)
    commit

        先执行1,在执行2

       这时:

          在事务1执行时,事务2可以增加一条"id=1"的数据,造成幻影读。

     

     

  • 相关阅读:
    NS3网络仿真(3): NetAnim
    C++中explicit关键字作用
    JS实现页面跳转 浏览器地址栏保持不变
    凤凰岭一日游
    开发一个软件平台的一些心得体会
    对Jscript操作注册表接口的一点不解
    关于jacob支持BSTR类型的经验总结
    Java 开源博客 —— Solo 0.6.8 正式版发布了!
    Java 开源博客 —— Solo 0.6.8 正式版发布了!
    解决The requested resource is not available的办法
  • 原文地址:https://www.cnblogs.com/zping/p/1268278.html
Copyright © 2020-2023  润新知