2008年12月21日星期日

SQL Server2005数据库事务隔离级别实验记录(1)--Read Uncommitted

Read Uncommitted:运行读取其他事务已修改未提交的的数据行:不放置共享锁就读取,即使已经防止排他锁。与nolock效果一致
实验:初始状态:Ntusername ='1' where rownumber =8

在第1进程执行:
begin transaction
update t08102101
set Ntusername ='2'
where rownumber =8
select @@trancount

在第2个进程执行
select * from t08102101
where rownumber =8
进程无法返回数据(第1个进程未提交)
改为下面的第3进程
set transaction isolation level read uncommitted
select * from t08102101
where rownumber =8
或第4进程:
select * from t08102101 (nolock)
where rownumber =8
得到Ntusername ='2',即更新后,但是未提交的数据
在第1个进程提交 commit tran 或 rollback tran后数据或提交或回滚,重新执行允许脏读的两个(3,4)进程,都会得到或提交或回滚后的结果

结论:脏读是从内存中读取,无论是否提交,它读到的都是最新状态,而不一定是结果状态。
注意:设置事务隔离级别是针对连接线程而言的,对第3线程而言,只要没有关闭查询窗口,
只要设置隔离级别的命令一提交,则对该查询窗口且只对该窗口内执行的语句有效。
--11:58 2008-12-21