为什么不是死锁而是阻塞?
数据库是sqlServer2008 R2
1.) 建立一个测试表——
create table tbl(id int, val int)
create index idx on tbl(id)
insert into tbl select 1, 100
insert into tbl select 2, 200
2.) 在第一个查询窗口中输入(此时不要执行)——
begin tran
update tbl set val = 1000 where id = 1
waitfor delay '00:00:05'
select * From tbl where id = 2
3.) 在第二个查询窗口中输入(此时不要执行)——
begin tran
update tbl set val = 2000 where id = 2
waitfor delay '00:00:05'
update tbl set val = 1000 where id = 1
4.) 同时运行上两个窗口的脚本,很快能得到其中一个的死锁报错信息,符合预期。
5.)对成功执行的窗口执行rollback,为下面的测试做准备
6.)删除索引——
drop index idx on tbl
7.) 还是同时运行上两个窗口的脚本,这次其中一个窗口会很快返回数据,另一个窗口一直处于运行状态
为什么会是这样呢,谁能给个答案?
注:我未对测试数据库属性做任何额外的设置,即隔离级别是默认的READ COMMITTED,也未启用基于行版本控制的隔离级别。查看sys.dm_tran_locks发现数据太多了,以我的智慧和武功无法解释:(