语句1. select * from sys.sysprocesses  where blocked>0
语句2. exec sp_lock (只讨论当当前数据库中Mode为X的锁)有以下问题请问给位,谢谢!
1.语句1是显示当前数据库中被阻塞的进程吗?
2.语句2的结果中若Mode为X的进程(且属于当前数据库的进程)是否也应该在语句1中出现(但是实际不是这样的,由于不能上传图片,请问是为什么)?
  

解决方案 »

  1.   

    1、可以粗略这样理解,但是有些情况不是阻塞,忘记了什么情况,不过大部分情况是可以用来检查的。
    2、1中不涉及锁的问题,你要查看的话应该用sys.dm_tran_lock
      

  2.   

    谢谢,麻烦帮指点下以下问题
    1. S锁、IS锁、Sch_M锁是不会引起阻塞的吧?
    2.select * from sys.dm_tran_locks where request_mode='X'中进程会影响阻塞与死锁的吧?
    3. select * from sys.sysprocesses where blocked>0的结果是目前发生deadlock的进程吧?
    4.怎样看系统中的进程哪些是阻塞,哪些是deadlock进程?
      

  3.   

    1. S锁、IS锁、Sch_M锁是不会引起阻塞的吧?
    看隔离级别,默认隔离级别的S会阻塞其他事务的X,如果加上S的事务,可以升级到X,但是其他事务不能在已经持有S的资源上加X。SCH_M是架构修改锁,比如修改表结构等,这个时候会阻塞其他事务对表的修改,IS是意向共享锁,在阻塞方面和S差不多。
    2.select * from sys.dm_tran_locks where request_mode='X'中进程会影响阻塞与死锁的吧?
    X会阻塞所有其他事务的x锁,但是在with nolock这些方面,不阻塞S。死锁嘛,看你的操作顺序了,如果A持有X,b在另外一个资源持有X,而A的事务未结束,要访问B的那个X所在的资源,B在锁住那个资源之后又去访问A的那个X上的资源,就产生互相等待,死锁就出现。
    3. select * from sys.sysprocesses where blocked>0的结果是目前发生deadlock的进程吧?
    要搞清楚“阻塞”和“死锁”的区别,这句通常用来查阻塞,查等待,不是用来查死锁,如果2008之前,要抓死锁图
    4.怎样看系统中的进程哪些是阻塞,哪些是deadlock进程?
    deadlock绝大部分5秒内就会被sqlserver杀掉,一般很难抓到,2008的话可以用extended events来获取。阻塞的话要看sys.dm_os_waiting_tasks这个表。上面有相关信息,然后再去深入研究。这个DMV是切入点。
      

  4.   

    语句1. select * from sys.sysprocesses  where blocked>0
    语句2. exec sp_lock (只讨论当当前数据库中Mode为X的锁)
    第1个语句是你加了一个where blocked >0 ,那么就返回被阻塞的会话的信息,这些被阻塞的会话,肯定格式获取了各种锁,可能是X,可能是S锁。第2个语句是会话的获取锁的信息,获取锁的会话不一定会被阻塞。所以,1是获取阻塞的信息,2是获取锁的信息。阻塞的会话肯定也获取了相关的锁,而获取锁的信息中,肯定也包含了阻塞的相关锁信息,也有不是阻塞的锁信息
      

  5.   


    1、S锁是共享锁,IS是意向共享锁,Sch_M是架构修改锁,这三个都有可能引起阻塞问题,
    比如S锁,会阻塞某个会话获取X锁的请求,而Sch_M是最有可能引起阻塞的,你想你把某一列给删除了,那么肯定引起大面积的阻塞,可以阻塞其他任何锁请求。IS锁引起阻塞的可能最小。2.这个视图查询来的是,获取X锁的一些会话,有可能是导致阻塞和死锁的会话,你需要特别注意视图中的request_status为wait的,说明在他的锁申请被阻塞了,正在等待。
      

  6.   


    3、 select * from sys.sysprocesses where blocked>0的结果只是阻塞的信息,不一定是死锁的信息,一般死锁是阻塞的升级版,你要跟踪死锁,建议通过sql profiler中的Lock的Deadlock Graph事件来跟踪死锁,显示的是直观的图形,很容易理解。4、可以发现那些是阻塞的,但很难看得出是死锁的,因为系统有一个定时任务Lock_monitor 会定时扫描死锁的会话,然后对其中一个会话进行回滚,从而解除死锁。阻塞信息,可以通过你上面写的:select * from sys.sysprocesses where blocked>0来找,或者在2005版本中也可以:select * from sys.dm_os_waiting_tasks来查询。
      

  7.   

    补充一下,sys.dm_tran_lock,除了要看锁类型,还要看状态,是grant还是wait
      

  8.   

    谢谢各位的指点,
    我运行select * from sys.sysprocesses where blocked>0时,经常发现其结果中spid与blocked是相同,请问
    a. spid与blocked相同,这说明进程自己阻塞自己吗?
    b. 若a成立,为什么进程自己阻塞自己呢?
      

  9.   

    不一定,有些latch会自己阻塞自己,不过只要时间不会很久,就没问题