你可以选择:
select count(*) from TestTrans with(nolock)
select count(*) from TestTrans with(readpast)

解决方案 »

  1.   

    这并不是说SQL Server 2000是表锁,只不过是因为你要count,而另一个进程里数据正在变化,直接影响你的count结果.如果你的表testid是主键,
    在新的进程里的update TestTrans set contactname='aa' where testid=xx --xx非9或insert into TestTrans
    (testid, contactname, contactage) values (12, 'contact46', '32')都不需要等待.
      

  2.   

    试验过了, 在repeatable read事务等级下, 用with(readpast)锁定提示不会出现不可重复读现象, 
    用with(nolock)会出现不可重复读现象. 因此with(readpast)锁定提示是不错的选择.非常感谢!
      

  3.   

    这并不是说SQL Server 2000是表锁,跟你当前用的事务有关,
    SQL SERVER 事务隔离级别 默认是READ COMMITTED,你查询时,要读取当前已经递交的事务,
    所以select (*) 一直在等待前一个事务递交你直接用
    select count(*) from TestTrans with(nolock)
    select count(*) from TestTrans with(readpast)
    统计不会包括9这条数据
      

  4.   

    testid之前是主键, 测试还是锁表, 后来我以为是主键的问题, 把testid的主键属性去掉了, 结果还是一样的--锁表.wzy_love_sly说得不错, 锁升级了, 但表里已经有十来条记录了, 搞不清楚为什么锁会升级呢?
    查询了<SQL Server2000技术内幕>, 没有找到合理的说明.这个问题确实有点费解, 在READ COMMITTED这个事务等级上, 前一个事务正在进行中还没有提交, 那么count根本
    不需要等到锁的释放啊, 直接返回那个事务开始前的记录数不就行了???我认为, MySQL(InnoDB)那样的锁定才是合理的.
      

  5.   

    插入,记得是会加个page锁,你现在的表里没有数据,只要锁了page,就是锁了表
    应为就一个page页哦!
    想测试,多加点数据,把数据加过一页,然后在insert 就不是表锁了