您现在的位置是:首页 > 文章详情

Sql 查询时候,有个别表一直显示“正在执行中...”,但是其他表都是正常的(解决死锁问题)

会飞的猪2018-10-16132人围观
简介白码驿站是一个面向开发者的知识共享社区,专注于为开发者打造一个纯净的技术交流社区(源码下载,免费在线图片压缩,jquery插件,插件下载,JS/CSS在线压缩。)-白码驿站

问题


今天在查询语句的时候,发现职位表一直显示正在查询中(表中的数据并不是很多),但是其他的表查询都是正常的


原因


问题真的是很奇怪,于是去百度,找了很久发现可能是进程阻塞造成的

解决


使用下面的语句可以轻松查询出是因为那些进程造成数据库死锁的。

                                        
DECLARE @spid INT ,
    @bl INT;  
DECLARE s_cur CURSOR
FOR
    SELECT  0 ,
            blocked
    FROM    ( SELECT    *
              FROM      sys.sysprocesses
              WHERE     blocked > 0
            ) a
    WHERE   NOT EXISTS ( SELECT *
                         FROM   ( SELECT    *
                                  FROM      sys.sysprocesses
                                  WHERE     blocked > 0
                                ) b
                         WHERE  a.blocked = spid )
    UNION
    SELECT  spid ,
            blocked
    FROM    sys.sysprocesses
    WHERE   blocked > 0;
OPEN s_cur;
FETCH NEXT FROM s_cur INTO @spid, @bl;
WHILE @@FETCH_STATUS = 0
    BEGIN
        IF @spid = 0
            SELECT  ' 引起数据库死锁的是: ' + CAST(@bl AS VARCHAR(10))
                    + ' 进程号, 其执行的SQL 语法如下';
        ELSE
            SELECT  ' 进程号SPID :' + CAST(@spid AS VARCHAR(10)) + ' 被'
                    + ' 进程号SPID :' + CAST(@bl AS VARCHAR(10))
                    + ' 阻塞, 其当前进程执行的SQL 语法如下'; 
        DBCC INPUTBUFFER (@bl );
        FETCH NEXT FROM s_cur INTO @spid, @bl;
    END;
CLOSE s_cur;  
DEALLOCATE s_cur
                                

然后只需要杀死阻塞进程就可以了:

                                        
kill 进程号
                                


文章评论

Top

目录

昵称:会飞的猪

职业:.net程序员

邮箱:753109098@qq.com

分类标签

本栏推荐