1. 使用 sp_who 这个存储过程, 查询sql上的当前进程, 观察 blk 列值是否有不为0的, 如果有不为 0 的, 表示有阻塞, 产生阻塞的进程的 spid 即是 blk 列值, 被阻塞的进程是 列 blk 值不为0的记录行对应的 spid.
2. 执行 sp_lock
3. 执行 sp_lock
4. 结合 2, 3 分析原因。
5. 使用 dbcc inputbuffer(
如果要自动删除阻塞的进程, 那么写一个 job 定期查询 sp_who , 将 blk 列值不为 0 的记录找出来, 用 kill 杀掉相关的进程即可。
注意, 一般不要轻易杀进程, 如果你的程序没有写好, 可能会导致不完整的数据。
例如, 在写订单主表和明细表的处理中, 没有使用事务, 当主表数据插入完成, 准备插入明细表数据时, 产生阻塞, 被你的监控程序 kill 掉的话, 就导致数据库中有不完整的订单(只有主表, 没有明细数据)。
另外, 如果你的程序的错误处理没有控制好, 则这样杀进程也容易导致程序崩溃, 丢失等。
另外, 查询进程相关的信息也可以直接查询 master.dbo.sysprocesses, 这里包含完整的信息, 你可以通过 blocked 列看是否有阻塞发生, 也可以看诸如登录的用户, 客户端, 使用此进程的前端applicationame等信息。
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
- 数据库处理专题 (8785篇文章)
- Oracle语句优化规则汇总(8) (17次浏览)
- Data Guard学习物理standby高级管理 (17次浏览)
- 甲骨文如何解析语义谜题 (13次浏览)
- 一步一步配置Oracle Stream (11次浏览)
- 如何查找运行系统里的“bad sql”语句 (9次浏览)
- 讲解“Oracle”下导出某用户所有表的方法 (8次浏览)
- Oracle语句优化规则汇总(5) (8次浏览)
- Oracle更新操作优化 (8次浏览)
- 实现数据库事务的方法ExecuteSqlTran() (7次浏览)
- Oracle中利用一个表结构拷贝成另外的表 (7次浏览)



