新建两个连接
在第一个连接中执行以下语句
select * from table1
begin tran
update table1 set c='c'
select * from table1
waitfor delay '00:00:10' --等待10秒
rollback tran
select * from table1
在第二个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
print '脏读'
select * from table1
if @@rowcount>0
begin
waitfor delay '00:00:10'
print '不重复读'
select * from table1
end
第二个连接的结果
脏读
A B C
a1 b1 c
a2 b2 c
a3 b3 c
'不重复读'
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
READ COMMITTED
指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。该选项是 SQL Server 的默认值。
在第一个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
begin tran
print '初始'
select * from table1
waitfor delay '00:00:10' --等待10秒
print '不重复读'
select * from table1
rollback tran
在第二个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
select * from employee where job_id=13 and minit='m'
go
begin tran
update employee
set fname='loveyou'
where job_id=13 and minit='M'---事物不提交
---以下在另一个连接中执行-------------
set transaction isolation level read uncommitted --读为未提交
go
select * from Employee
where job_id=13 and minit='M'--则此时的数据fname被该为了loveyou,为脏读
--重新设置事物的隔离级别--------------
set transaction isolation level read committed --读为提交
go
select * from Employee
where job_id=13 and minit='M'--则此时的数据fname被为原来的数值
begin tran
update employee
set fname='loveyou'
where job_id=13 and minit='M'---事物不提交
---以下在另一个连接中执行-------------
set transaction isolation level read uncommitted --读为未提交
go
select * from Employee
where job_id=13 and minit='M'--则此时的数据fname被该为了loveyou,为脏读
--重新设置事物的隔离级别--------------
set transaction isolation level read committed --读为提交
go
select * from Employee
where job_id=13 and minit='M'--则此时的数据fname被为原来的数值
是为了防止在事务没有完成的时候另一用户,访问事务内,未提交的数据
create table Table1 (a int)
go
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
begin tran
insert table1 values(1) ----这句在事物没有commit前,被另一个用户
----访问是错误的,应为下面有可能会出错