日期:2014-05-17  浏览次数:20477 次

SQL锁进程怎么理解、如何处理以及预防
最近数据库(SQL Server 2000 sp4)出现锁问题(阻塞,正在阻塞)。

问题发现是在软件登录后,做某些查询没有返回结果。

通过“企业管理器”连接后,在“管理”->“当前活动”->“锁/进程”下看到有:
  spid 53  
  spid 54 (阻塞)
  spid 55 (阻塞)
  spid 56
  spid 57 (正在阻塞)


再查看各spid节点下,列出一些sql操作,有些是查询语句、有些是插入语句

由于一时不知道如何处理,只好简单地“取消进程”


“取消进程”会导致部分语句没有执行,导致数据不完整。



现在有以下问题:
1)出现“阻塞”情况后,并不是所有的SQL语句都被禁止执行,不知道是按什么规则来决定

2)什么原因为导致“阻塞”

3)“阻塞”如何处理比较好?能否把阻塞的spid节点下的sql语句手工执行一遍?

4)如何预防?




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