declare @i int
set @i=1
while @i<=20000
begin
insert into mytable(tid,tname) values(@i,'<'+space(4998)+'>')
set @i = @i + 1
end
go
alter database <database_name> set read_committed_snapshot on
go
alter database <database_name> set allow_snapshot_isolation on
go
2、在一个窗口(A窗口)中执行以下语句
use <database_name>
begin tran
update mytable set tname = 'hello' where tid > 5000
注意:只有"begin tran",先不要commit或rollback
3、在另一个窗口(B窗口)中执行以下语句
use <database_name>
update mytable set tname = 'hello' where tid = 1
go
结果B窗口被阻塞
4、再开一个窗口(C窗口)
查询sys.dm_tran_locks表,发现A窗口加了X锁,而B窗口处理WAIT状态
5、将A窗口rollback后,B窗口执行完成
6、在A窗口的begin tran 前增加“set transaction isolation level
snapshot”,使A窗口在“读取已提交快照”下执行,结果同样出现了加X锁的情况
7、将A窗口的“ where tid > 5000”改成“where tid = 2”,加锁的情况没有再出现
我很郁闷,在多台机器上测试都是这样的结果,还望多位高人多指点,在此多谢了
thanks!
“RM”编写: