没办法了,只能请教您了
2个会话
/*创建表t1,c1列聚集索引,c2非聚集索引,c3无索引*/会话1-->死循环update表中的非聚集索引根据聚集索引
update t1 set c2 = 5 where c1 = 5会话2-->死循环select c2,c3(无任何索引) from t1 where c2 between 3 and 300
检索数据后插入临时表,再执行truncate table 临时表执行1后紧接执行2后会发生死锁现象.......(即进程**为**的牺牲品...)会话一 waiting select****释放S锁,得到X锁
会话二 waiting update的产生的锁可是再执行几次后,发现死锁消失,查看了下锁进程发现select用的是覆盖索引,即显示的索引是(t1.t1)可是我没有创建过覆盖索引。我的sqlserver是2000和2005一个实例

解决方案 »

  1.   

    我的意思是select c2,c3(无任何索引) from t1 where c2 between 3 and 300
    用的是c2列上的索引,而在锁进程中发现他用的索引是 t1.t1
    这是为什么???
      

  2.   

    按对象分类的锁:进程ID     锁类型     锁模式    锁状态     索引     对象
    58          DB         S        GRANT       t1       TestDB   (update操作)
    59          DB         S        GEANT       t1       TestDB   (select操作)
    查看了下按进程分类的锁:
    进程58
    对象                               锁类型     锁模式     锁状态     索引     
    TestDB                              DB          S         GRANT      t1
    TestDB.dbo.sp_helpextendedproc      RID         U         GRANT      t1TestDB.dbo.sp_helpextendedproc是什么东西啊???再看下进程59
    对象                               锁类型     锁模式     锁状态     索引     
    TestDB                              DB          S         GRANT      t1
    TestDB.dbo.sp_helpextendedproc      TAB         Sch-M     GRANT      t1
    TestDB.dbo.sysindexes               Key         X         GRANT      sysindex发现第一次执行发现死锁现象时候,进程58明明是对索引c2是Grant,c1上的聚集索引是Waiting
    ,现在执行update对这两个索引要求都没了,
    select也发生了很大的变化,这是为什么,sql会自动创建索引t1,因为表t1用来测试,所以我认为索引t1是覆盖索引
      

  3.   

    不知道你想说什么?
    ---查询SQL是否进程死锁(CSDN--鄒健)
    CREATE proc SP_Sys_LockInfo
    @kill_lock_spid bit=0,  --是否殺掉鎖死的進程,1 殺掉, 0 僅顯示
    @show_spid_if_nolock bit=1 --如果沒有鎖死的進程,是否顯示正常進程資訊,1 顯示,0 不顯示
    as
    declare @count int,@s nvarchar(4000),@i int
    select id=identity(int,1,1),標誌,
    進程ID=spid,線程ID=kpid,塊進程ID=blocked,資料庫ID=dbid,
    資料庫名=db_name(dbid),用戶ID=uid,用戶名=loginame,累計CPU時間=cpu,
    登陸時間=login_time,打開事務數=open_tran, 進程狀態=status,
    工作站名=hostname,應用程式名=program_name,工作站進程ID=hostprocess,
    功能變數名稱=nt_domain,網卡位址=net_address
    into #t from(
    select 標誌='鎖死的進程',
      spid,kpid,a.blocked,dbid,uid,loginame,cpu,login_time,open_tran,
      status,hostname,program_name,hostprocess,nt_domain,net_address,
      s1=a.spid,s2=0
    from master..sysprocesses a join (
      select blocked from master..sysprocesses group by blocked
      )b on a.spid=b.blocked where a.blocked=0
    union all
    select '|_犧牲品_>',
      spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran,
      status,hostname,program_name,hostprocess,nt_domain,net_address,
      s1=blocked,s2=1
    from master..sysprocesses a where blocked<>0
    )a order by s1,s2select @count=@@rowcount,@i=1if @count=0 and @show_spid_if_nolock=1
    begin
    insert #t
    select 標誌='正常的進程',
      spid,kpid,blocked,dbid,db_name(dbid),uid,loginame,cpu,login_time,
      open_tran,status,hostname,program_name,hostprocess,nt_domain,net_address
    from master..sysprocesses
    set @count=@@rowcount
    endif @count>0
    begin
    create table #t1(id int identity(1,1),a nvarchar(30),b Int,EventInfo nvarchar(3500))
    if @kill_lock_spid=1
    begin
      declare @spid varchar(10),@標誌 varchar(10)
      while @i<=@count
      begin
       select @spid=進程ID,@標誌=標誌 from #t where id=@i
       insert #t1 exec('dbcc inputbuffer('+@spid+')')
       if @標誌='鎖死的進程' exec('kill '+@spid)
       set @i=@i+1
      end
    end
    else
      while @i<=@count
      begin
       select @s='dbcc inputbuffer('+cast(進程ID as varchar)+')' from #t where id=@i
       insert #t1 exec(@s)
       set @i=@i+1
      end
    select a.*,進程的SQL語句=b.EventInfo
    from #t a join #t1 b on a.id=b.id
    end-------
    执行
    exec SP_Sys_LockInfo
      

  4.   

    To = > : zp_cool(志鹏)执行上面邹大侠的存储过程就可以查看当前死锁的SQL了?
      

  5.   

    我的意思是select c2,c3(无任何索引) from t1 where c2 between 3 and 300
    用的是c2列上的索引,而在锁进程中发现他用的索引是 t1.t1
    这是为什么???
    --------------------------------------------------c3是无索引的, 所以必须访问基础表才能拿到 c3 的数据, 而无论条件是否通过索引过滤, 最终访问基础表的数据都必须经过聚集索引的(除非你的表上没有聚集索引)