WEB开发网
开发学院数据库MSSQL Server SQL-92 隔离级别理解和测试 阅读

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

 2008-08-26 09:55:58 来源:WEB开发网   
核心提示:以前对数据库的隔离级别,有所了解,SQL-92 隔离级别理解和测试,但不知道真正其中的区别,今天就讨论一下这4个隔离级别 下面是4个隔离级别,在执行2这时:在事务1执行时,事务2可以增加一条"id=1"的数据,在SQL server 2005里的介绍:READ UNCOMMITTED指定语句可以读取

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

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

READ UNCOMMITTED

指定语句可以读取已由其他事务修改但尚未提交的行。

READ COMMITTED

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

REPEATABLE READ

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

SERIALIZABLE

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

建立环境:

createtablet_emp(idnumeric(10)
  ,namevarchar(10),
  salarynumeric(10,2));

插入数据:

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

脏读

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

测试语句一:

 SETTRANSACTIONISOLATIONLEVELREADUNCOMMITTED
  begintran
  select*fromdbo.t_empwhereid=1

测试语句二:

SETTRANSACTIONISOLATIONLEVELREADUNCOMMITTED
  begintran
  updatet_empsetname='zping.com'whereid=1

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

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

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

显示例子:

   SETTRANSACTIONISOLATIONLEVELREADCOMMITTED
  begintran
  select*fromdbo.t_empwhereid=1waitfordelay'00:00:03'
  select*fromdbo.t_empwhereid=1
  SETTRANSACTIONISOLATIONLEVELREADCOMMITTED
  begintran
  --1,insertintot_empvalues(1,'33',434)
  --2,deletet_empwhereid=1
  --3;updatet_empsetname='fff'whereid=1
  --4;updatet_empsetid=1whereid=2
  commit

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

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

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

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

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

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

幻像读

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

测试例子:

  SETTRANSACTIONISOLATIONLEVELREPEATABLEREAD
  begintran
  select*fromdbo.t_empwaitfordelay'00:00:03'
  select*fromdbo.t_emp
  SETTRANSACTIONISOLATIONLEVELREPEATABLEREAD
  begintran
  insertintot_empvalues(1,'33',434)
  commit

先执行1,在执行2

这时:

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

Tags:SQL 隔离 级别

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接