最近数据库(SQL Server 2000 sp4)出现锁问题(阻塞,正在阻塞)。问题发现是在软件登录后,做某些查询没有返回结果。通过“企业管理器”连接后,在“管理”->“当前活动”->“锁/进程”下看到有:
  spid 53  
  spid 54 (阻塞)
  spid 55 (阻塞)
  spid 56
  spid 57 (正在阻塞)
再查看各spid节点下,列出一些sql操作,有些是查询语句、有些是插入语句由于一时不知道如何处理,只好简单地“取消进程”
“取消进程”会导致部分语句没有执行,导致数据不完整。现在有以下问题:
1)出现“阻塞”情况后,并不是所有的SQL语句都被禁止执行,不知道是按什么规则来决定2)什么原因为导致“阻塞”3)“阻塞”如何处理比较好?能否把阻塞的spid节点下的sql语句手工执行一遍?4)如何预防?

解决方案 »

  1.   

    现在有以下问题:
    1)出现“阻塞”情况后,并不是所有的SQL语句都被禁止执行,不知道是按什么规则来决定
    堵塞状图就是处于等待别的事务释放锁的状态
    如:A事务对资源持有排他锁 B对字段申请的任何锁都要等待A事务锁释放后才能持有申请的锁
    2)什么原因为导致“阻塞”
    堵塞是正常
    3)“阻塞”如何处理比较好?能否把阻塞的spid节点下的sql语句手工执行一遍?
    尽量让事务持有锁的时间减少-->涉及的问题比较多 如隔离级别 语句是否优化 是否按照顺序访问等等
    4)如何预防?
    堵塞是正常的 只能尽量减少锁持有时间
    如果你查询能接受脏数据 可以再查询表指定 nolock 不申请共享锁
      

  2.   

    参考 http://www.cnblogs.com/WizardWu/archive/2010/08/13/1798645.html