zoukankan      html  css  js  c++  java
  • 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"的数据,造成幻影读。

     

     

  • 相关阅读:
    .NET Framework 4.5 中新增的'可移植类库'功能
    使用visual sutdio右键菜单封装字段
    Visual Studio 2008的“组织using”菜单
    HTML5与HTML4的区别
    【百度地图API】如何制作公交线路的搜索?如331路
    【百度地图API】如何给自定义覆盖物添加事件
    【百度地图API】如何制作自定义样式的公交导航结果面板?
    【百度地图API】如何制作可拖拽的沿道路测距
    透过【百度地图API】分析双闭包问题
    【百度地图API】如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅、加油站、宾馆、大厦等
  • 原文地址:https://www.cnblogs.com/zping/p/1268278.html
Copyright © 2011-2022 走看看