【一点陋见】
我做了一些测试 结果跟楼主的一样 有必要说明的是 有没有select * from locktest with(rowlock,updlock) where id=1这句结果是一样的 至少我测试下来是这样 下面是额外一些测试 写出来和你探讨在QA中开启两个连接,连接一中执行下列语句
begin tran
set xact_abort on 
select * from t2 with (holdlock)
waitfor delay '00:01:00'
commit tran
紧接着在连接二中执行
select * from t2
结果正常显示若把set xact_abort on部分拿掉再次运行 仍没有问题 因此我认为waitfor这句话作用范围是后面的语句而不是整个事务;当然如果我们拿掉楼主的WAITFOR DELAY '00:00:55'语句是不存在死锁问题的,同时这句没有执行完毕这个事务就没有运行完 update操作对表施加的默认表不会释放 因为with (nolock)忽略锁的存在 允许脏读 所以
select * from locktest with (nolock) where id=5可以成功运行 而
select * from locktest因为无法得到读锁被HANG住楼主要想在上一个事物提交之前,得到返回结果为“李 明” 可以把waitfor这句提前来实现 我测试下来是可以的,即在连接一中运行BEGIN TRANSACTION
select * from locktest with(rowlock,updlock) where id=1
WAITFOR DELAY '00:00:55'
update locktest set name = '李 明test' where id=5
COMMIT TRANSACTION
之后,在连接二中运行select * from locktest with (nolock) where id=5就是你想要的

解决方案 »

  1.   

    另外 分别执行
    C1:
    begin tran
    set xact_abort on 
    select * from t2 with (holdlock)
    waitfor delay '00:01:00'
    commit tran
    C2:
    select * from t2和C1:
    begin tran
    set xact_abort on 
    update t2 set snote = '' where ...
    waitfor delay '00:01:00'
    commit tran
    C2:
    select * from t2
    结果也不一样 第一个立即出来 第二个等待一分钟之后显示
      

  2.   

    可以 两者加在表上的锁是不同的 但是第二个结果和楼主的用例其实有点矛盾 感觉比较奇怪!
    我又做了一下跟楼主相似的试验 很奇怪 这次select * from locktest where id=5不HANG了在一分钟之后就会出来
      

  3.   

    我的例子只是模拟我的程序的实际操作我要大批量更改数据,更改前要锁住这些数据,这个更改事务可能要执行一个小时以上。
    而在更改期间,如果有人要查询数据的话,不能让他看到更改中的脏读数据,也就是说
    要让他看到更改前的数据,直到我的更改完成。所以把waitfor这句提前来实现是不行的,
    如果只更改一条数据,把waitfor这句提前是可以的,如果要更改大量数据就不行了。另外,昨天写完帖子后,我也做了深入的调查,因为我这个系统用的是sql server 2005
    用sql server 2005的快照隔离可以实现这个功能。但是我还是想知道如果是sql server 2000的话,相同的功能是否可以实现?
      

  4.   

    ding..............
    【华为/慧通 C、C++、VC、Java 程序员招聘】 详见: http://community.csdn.net/Expert/topic/4536/4536791.xml?temp=.0224573