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