SQL-92 隔离级别理解和测试

  以前对数据库的隔离级别,有所了解,但不知道真正其中的区别。今天就讨论一下这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"的数据,造成幻影读。

 

 

posted @ 2008-08-17 22:26  zping  阅读(767)  评论(0编辑  收藏  举报