阻塞一一般处理/解决方法是

1. 使用 sp_who 这个存储过程, 查询sql上的当前进程, 观察 blk 列值是否有不为0的
   如果有不为 0 的, 表示有阻塞, 产生阻塞的进程的 spid 即是 blk 列值, 被阻塞的进程是 列 blk 值不为0的记录行对应的 spid

2. 执行 sp_lock <spid) 查询(spid是产生阻塞的进程的spid) 查看产生阻塞的对象的库id/对象id, 及用的锁

3. 执行 sp_lock <spid) 查询(spid是被阻塞的进程的spid) 查被生阻塞的对象的库id/对象id, 及请求使用的锁

4. 结合 2, 3 分析原因

5. 使用 dbcc inputbuffer(<spid) 查询产生阻塞和被阻塞的 T-SQL 语句, 结合 2, 3 的结果进一步分析和寻找解决方法.

如果要自动删除阻塞的进程, 那么写一个 job 定期查询 sp_who , 将 blk 列值不为 0 的记录找出来, 用 kill <spid> 杀掉相关的进程即可.


注意, 一般不要轻易杀进程, 如果你的程序没有写好, 可能会导致不完整的数据.
例如, 在写订单主表和明细表的处理中, 没有使用事务, 当主表数据插入完成, 准备插入明细表数据时, 产生阻塞, 被你的监控程序 kill 掉的话, 就导致数据库中有不完整的订单(只有主表, 没有明细数据)

另外, 如果你的程序的错误处理没有控制好, 则这样杀进程也容易导致程序崩溃, 丢失等.

另外, 查询进程相关的信息也可以直接查询 master.dbo.sysprocesses, 这里包含完整的信息, 你可以通过 blocked 列看是否有阻塞发生, 也可以看诸如登录的用户, 客户端, 使用此进程的前端applicationame 等信息.


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值