1\数据表
TableName
id int not null
name varchar null2\第一查询(修改事务)
begin tran
update dbo.TableName with (rowlock,updlock) set name = '4' where id = 1
waitfor delay '00:00:10';
rollback tran3\第二个查询(sql)
select * from dbo.TableName where id = 2===========================
使用sp_lock查询锁,发现当前TableName 表产生了三个锁:RID(行锁),PAG(数据页),TAB(表)
1问题:sql server 在修改时会自动产生这三种锁,是否可以设置为只产生RID(行锁)呢?
2如何在第一个查询未执行完时,执行第二个查询?

解决方案 »

  1.   

    select * from T (nolock)
      

  2.   

    update 的話,是一定會加鎖的
      

  3.   


    select * from TB(nolock)
      

  4.   

    id设置为主键时,第一个sql只会对行产生排它锁,对页和表产生意向锁,这并不影响查询2.
    但如果id不为主键也没有索引,那么查询2而必须等待查询1.
      

  5.   


    当我为表tablename的id建立主键(建立聚集索引)后
    查询1未处理完时,查询2仍然等待,使用sp_lock查看当前TableName 表产生了三个锁:KEY(行锁),PAG(数据页),TAB(表)