Sql Server查询死锁信息

存储过程,执行时确定是否处理死锁和显示死锁信息

ALTER PROC [dbo].[p_lockinfo]
    @kill_lock_spid BIT = 0 ,     --是否杀掉死锁的进程,1   杀掉,   0   仅显示   
    @show_spid_if_nolock BIT = 1   --如果没有死锁的进程,是否显示正常进程信息,1   显示,0   不显示   
AS
    DECLARE 
		@count INT ,
        @s NVARCHAR(4000) ,
        @i INT   
    SELECT  id = IDENTITY( INT,1,1 ),
            标志 ,
            进程ID = spid ,
            线程ID = kpid ,
            块进程ID = blocked ,
            数据库ID = dbid ,
            数据库名 = DB_NAME(dbid) ,
            用户ID = uid ,
            用户名 = loginame ,
            累计CPU时间 = cpu ,
            登陆时间 = login_time ,
            打开事务数 = open_tran ,
            进程状态 = status ,
            工作站名 = hostname ,
            应用程序名 = program_name ,
            工作站进程ID = hostprocess ,
            域名 = nt_domain ,
            网卡地址 = net_address
    INTO    #t
    FROM    ( SELECT    标志 = '死锁的进程' ,
                        spid ,
                        kpid ,
                        a.blocked ,
                        dbid ,
                        uid ,
                        loginame ,
                        cpu ,
                        login_time ,
                        open_tran ,
                        status ,
                        hostname ,
                        program_name ,
                        hostprocess ,
                        nt_domain ,
                        net_address ,
                        s1 = a.spid ,
                        s2 = 0
              FROM      master..sysprocesses a
                        JOIN ( SELECT blocked FROM master..sysprocesses GROUP BY blocked ) b ON a.spid = b.blocked
              WHERE     a.blocked = 0
              UNION   ALL
              SELECT    '|_牺牲品_>' ,
                        spid ,
                        kpid ,
                        blocked ,
                        dbid ,
                        uid ,
                        loginame ,
                        cpu ,
                        login_time ,
                        open_tran ,
                        status ,
                        hostname ,
                        program_name ,
                        hostprocess ,
                        nt_domain ,
                        net_address ,
                        s1 = blocked ,
                        s2 = 1
              FROM      master..sysprocesses a
              WHERE     blocked <> 0
            ) a
    ORDER BY s1 ,s2   
    
    SELECT  @count = @@rowcount ,
            @i = 1   
    IF @count = 0 AND @show_spid_if_nolock = 1
        BEGIN   
            INSERT  #t
                    SELECT  标志 = '正常的进程' ,
                            spid ,
                            kpid ,
                            blocked ,
                            dbid ,
                            DB_NAME(dbid) ,
                            uid ,
                            loginame ,
                            cpu ,
                            login_time ,
                            open_tran ,
                            status ,
                            hostname ,
                            program_name ,
                            hostprocess ,
                            nt_domain ,
                            net_address
                    FROM    master..sysprocesses   
            SET @count = @@rowcount   
        END   
  
    IF @count = 0 AND @show_spid_if_nolock = 0
        BEGIN       
            SELECT * FROM #t
            RETURN          
        END
  
    IF @count > 0
        BEGIN   
            CREATE   TABLE #t1
                (
                  id INT IDENTITY(1, 1) ,
                  a NVARCHAR(4000) ,
                  b INT ,
                  EventInfo NVARCHAR(4000)
                )   
            IF @kill_lock_spid = 1
                BEGIN   
                    DECLARE 
						@spid VARCHAR(200) ,
                        @标志 VARCHAR(200)   
                    WHILE @i <= @count
                        BEGIN   
                            SELECT @spid = 进程ID , @标志 = 标志 FROM #t WHERE id = @i   
                            INSERT #t1 EXEC ( 'dbcc inputbuffer(' + @spid + ')' )   
                            IF @标志 = '死锁的进程'
								EXEC('kill '+@spid)   
                            SET @i = @i + 1   
                        END   
                END   
            ELSE
					WHILE @i <= @count
						BEGIN   
							SELECT @s = 'dbcc inputbuffer(' + CAST(进程ID AS VARCHAR) + ')' FROM #t WHERE id = @i   
							INSERT #t1 EXEC ( @s )   
							SET @i = @i + 1   
						END   
            SELECT  a.* ,
                    进程的SQL语句 = b.EventInfo
            FROM    #t a
                    JOIN #t1 b ON a.id = b.id   
        END

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server 中,可以通过以下步骤来检测和解决死锁: 1. 打开 SQL Server Management Studio,连接到目标数据库。 2. 在“工具”菜单中选择“SQL Server Profiler”。 3. 在“模板”中选择“标准”或“TSQL_Duration”。 4. 在“事件选择”选项卡中选择“Locks”和“Deadlock Graph”事件。 5. 在“事件过滤器”选项卡中,根据需要设置过滤器,以限制要监视的事件类型和对象。 6. 单击“运行”按钮开始监视。 7. 如果发生死锁,Profiler 将捕获并显示死锁图形。 8. 根据死锁图形中的信息,确定哪些 SQL 语句造成了死锁,然后对这些语句进行优化或重构。 9. 可以使用 SQL Server 提供的其他工具,如“活动监视器”和“系统动态管理视图”,来进一步分析和解决死锁问题。 除了以上提到的方法,还可以通过查询系统动态管理视图来检测死锁: SELECT db.name AS dbname, TL.resource_type AS restype, TL.resource_database_id AS dbid, TL.resource_associated_entity_id AS resid, TL.request_mode AS reqmode, TL.request_session_id AS sid, WT.blocking_session_id AS blockingid, H.TEXT AS sqltext FROM sys.dm_tran_locks AS TL INNER JOIN sys.databases AS db ON db.database_id = TL.resource_database_id INNER JOIN sys.dm_os_waiting_tasks AS WT ON TL.lock_owner_address = WT.resource_address INNER JOIN sys.dm_exec_sessions AS S ON WT.session_id = S.session_id CROSS APPLY sys.dm_exec_sql_text(WT.sql_handle) AS H WHERE TL.request_session_id = @@SPID AND TL.resource_type <> 'DATABASE' AND WT.blocking_session_id <> 0; 以上查询可用于检测当前会话中是否有死锁,并显示死锁所涉及的数据库、资源类型、请求模式、会话 ID、阻塞会话 ID 和 SQL 文本等信息。根据这些信息,可以进一步分析和解决死锁问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值