前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL SERVER 查询死锁

SQL SERVER 查询死锁

作者头像
跟着阿笨一起玩NET
发布2018-09-18 17:50:20
1.6K0
发布2018-09-18 17:50:20
举报
代码语言:javascript
复制
USE master
go

CREATE PROCEDURE [dbo].[sp_who_lock]
AS 
    BEGIN
        DECLARE @spid INT ,
            @bl INT ,
            @intTransactionCountOnEntry INT ,
            @intRowcount INT ,
            @intCountProperties INT ,
            @intCounter INT
        CREATE TABLE #tmp_lock_who
            (
              id INT IDENTITY(1, 1) ,
              spid SMALLINT ,
              bl SMALLINT
            )
 
        IF @@ERROR <> 0 
            RETURN @@ERROR
 
        INSERT  INTO #tmp_lock_who
                (
                  spid ,
                  bl
                )
                SELECT  0 ,
                        blocked
                FROM    (
                          SELECT    *
                          FROM      sysprocesses
                          WHERE     blocked > 0
                        ) a
                WHERE   NOT EXISTS ( SELECT *
                                     FROM   (
                                              SELECT    *
                                              FROM      sysprocesses
                                              WHERE     blocked > 0
                                            ) b
                                     WHERE  a.blocked = spid )
                UNION
                SELECT  spid ,
                        blocked
                FROM    sysprocesses
                WHERE   blocked > 0
        IF @@ERROR <> 0 
            RETURN @@ERROR 
  
-- 找到临时表的记录数
        SELECT  @intCountProperties = COUNT(*) ,
                @intCounter = 1
        FROM    #tmp_lock_who
 
        IF @@ERROR <> 0 
            RETURN @@ERROR 
 
        IF @intCountProperties = 0 
            SELECT  '现在没有阻塞和死锁信息' AS message
-- 循环开始
        WHILE @intCounter <= @intCountProperties 
            BEGIN
-- 取第一条记录
                SELECT  @spid = spid ,
                        @bl = bl
                FROM    #tmp_lock_who
                WHERE   Id = @intCounter 
                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 )
                END 
-- 循环指针下移
                SET @intCounter = @intCounter + 1
            END
        DROP TABLE #tmp_lock_who
        RETURN 0
    ENDView Code
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013-08-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档