最近发现一个非常奇怪的阻塞问题,如下截图所示(来自监控工具DPA),会话583被会话1036阻塞,而且阻塞发生在tempdb,被阻塞的SQL如下截图所示,会话等待类型为LCK_M_S

因为DPA工具不好截取全部信息,使用下面SQL语句获取了阻塞会话的详细信息如下,来自Microsoft SQL Server Management Studio - Transact-SQL IntelliSense的的SQL被阻塞了

SELECT  s.session_id ,

        r.status ,

        r.blocking_session_id 'Blk by' ,

        r.wait_type ,

        wait_resource ,

        r.wait_time / ( 1000 * 60 ) 'Wait M' ,

        r.cpu_time ,

        r.logical_reads ,

        r.reads ,

        r.writes ,

        r.total_elapsed_time / ( 1000 * 60 ) 'Elaps M' ,

        SUBSTRING(st.text, ( r.statement_start_offset / 2 ) + 1,

                  ( ( CASE r.statement_end_offset

                        WHEN -1 THEN DATALENGTH(st.text)

                        ELSE r.statement_end_offset

                      END - r.statement_start_offset ) / 2 ) + 1) AS statement_text ,

        COALESCE(QUOTENAME(DB_NAME(st.dbid)) + N'.'

                 + QUOTENAME(OBJECT_SCHEMA_NAME(st.objectid, st.dbid)) + N'.'

                 + QUOTENAME(OBJECT_NAME(st.objectid, st.dbid)), '') AS command_text ,

        r.command ,

        s.login_name ,

        s.host_name ,

        s.program_name ,

        s.last_request_end_time ,

        s.login_time ,

        r.open_transaction_count

FROM    sys.dm_exec_sessions AS s

        JOIN sys.dm_exec_requests AS r ON r.session_id = s.session_id

        CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st

WHERE r.session_id =583

ORDER BY r.cpu_time DESC;

而会话1036处于睡眠(sleeping)状态,有一个Open的事务。通过wait_resource的值“KEY: 2:1125899909070848 (79c68d10aa42)”,我们定位到是一个系统表sysschobj.它是sys.triggers这个系统视图的基表。如下所示:

SET QUOTED_IDENTIFIER ON

SET ANSI_NULLS ON

GO

CREATE VIEW sys.triggers AS

    SELECT o.name,

        object_id = o.id,

        parent_class = o.pclass,

        parent_class_desc = pc.name,

        parent_id = o.pid,

        type = o.type,

        type_desc = n.name,

        create_date = o.created,

        modify_date = o.modified,

        is_ms_shipped = sysconv(bit, o.status & 1),         -- OBJALL_MSSHIPPED

        is_disabled = sysconv(bit, o.status & 256),         -- OBJTRG_DISABLED

        is_not_for_replication = sysconv(bit, o.status & 512), -- OBJTRG_NOTFORREPL

        is_instead_of_trigger = sysconv(bit, o.status & 1024)     -- OBJTRG_INSTEADOF

    FROM sys.sysschobjs o

    LEFT JOIN sys.syspalnames n ON n.class = 'OBTY' AND n.value = o.type

    LEFT JOIN sys.syspalvalues pc ON pc.class = 'UNCL' AND pc.value = o.pclass

    WHERE o.type IN ('TA','TR') AND o.pclass <> 100

        AND has_access('TR', o.id, o.pid, o.nsclass) = 1

 

GO

使用下面脚本可以查到对应的锁信息(其实,正确的做法应该是加上条件过滤spid),从而可以判断,会话1036可能因为事务中,间接涉及对基表sysschobj的DML操作(有可能是衍生的系统视图),而由于事务没有提交也没有释放,导致在基表上的锁没有释放,从而导致出现这样一个阻塞。个人也很好奇是什么样的SQL会导致这样一个阻塞出现,不过这种阻塞源头是Sleeping状态的会话,已经无法定位阻塞源头SQL,只能通过Profile去跟踪捕获。但是这种阻塞出现时机和场景不清楚,很难一下子捕获到。

 

USE tempdb

GO

SELECT  request_session_id AS spid ,

        DB_NAME(resource_database_id) AS dbname ,

        CASE WHEN resource_type = 'OBJECT'

             THEN OBJECT_NAME(resource_associated_entity_id)

             WHEN resource_associated_entity_id = 0 THEN 'n/a'

             ELSE OBJECT_NAME(p.object_id)

        END AS entity_name ,

        index_id ,

        resource_type AS resource ,

        resource_description AS description ,

        request_mode AS mode ,

        request_status AS status

FROM    sys.dm_tran_locks t

LEFT JOIN sys.partitions p

ON      p.partition_id = t.resource_associated_entity_id

WHERE   resource_database_id = DB_ID()

今天早上有发现同样的阻塞,猜测是SQL里面有创建临时表或对临时表做DDL或DML操作的迹象。不过依然没有找到源头SQL,只能静候下次机会。找出“罪魁祸首”。不过让我头痛的是,对于这种特殊阻塞情况,即使是使用Profile跟踪也是相当麻烦,因为不知道它什么时间点出现、出现在那个会话。

SELECT  tl.resource_type AS [Resource Type] ,

        DB_NAME(tl.resource_database_id) AS [DB Name] ,

        CASE tl.resource_type

          WHEN 'OBJECT'

          THEN OBJECT_NAME(tl.resource_associated_entity_id,

                           tl.resource_database_id)

          WHEN 'DATABASE' THEN 'DB'

          ELSE CASE WHEN tl.resource_database_id = DB_ID()

                    THEN ( SELECT   OBJECT_NAME(object_id,

                                                tl.resource_database_id)

                           FROM     sys.partitions

                           WHERE    hobt_id = tl.resource_associated_entity_id

                         )

                    ELSE '(Run under DB context)'

               END

        END AS [Object] ,

        tl.resource_description AS [Resource] ,

        tl.request_session_id AS [Session] ,

        tl.request_mode AS [Mode] ,

        tl.request_status AS [Status] ,

        wt.wait_duration_ms AS [Wait (ms)] ,

        qi.sql ,

        qi.query_plan

FROM    sys.dm_tran_locks tl WITH ( NOLOCK )

LEFT OUTER JOIN sys.dm_os_waiting_tasks wt WITH ( NOLOCK )

ON      tl.lock_owner_address = wt.resource_address

        AND tl.request_status = 'WAIT'

OUTER APPLY ( SELECT    SUBSTRING(s.text,

                                  ( er.statement_start_offset / 2 ) + 1,

                                  ( ( CASE er.statement_end_offset

                                        WHEN -1 THEN DATALENGTH(s.text)

                                        ELSE er.statement_end_offset

                                      END - er.statement_start_offset ) / 2 )

                                  + 1) AS sql ,

                        qp.query_plan

              FROM      sys.dm_exec_requests er WITH ( NOLOCK )

              CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) s

              OUTER APPLY sys.dm_exec_query_plan(er.plan_handle) qp

              WHERE     tl.request_session_id = er.session_id

            ) qi

WHERE   tl.request_session_id =134

链接资料

一个特殊的SQL Server阻塞案例分析

SQL Server一个特殊的阻塞案例分析2

SQL Server一个特殊的阻塞案例分析2的更多相关文章

  1. SQL Server服务没有自动启动原因案例分析

    这个案例是前两天出现的,一直没有时间总结,25号凌晨4点去处理数据库的故障问题.远程连上公司的局域网,psping检查发现服务器的1433端口不通,数据库连接不上,但是主机又能ping通,登录服务器检 ...

  2. SQL Server 的锁定和阻塞

    本帖提供两种做法,可避免在 SQL Server 事务锁定时产生的不正常或长时间阻塞,让用户和程序也无限期等待,甚至引起 connection pooling 连接数超过容量. 所谓的「阻塞」,是指当 ...

  3. 一个特殊的SQL Server阻塞案例分析

    上周,在SQL Server数据库下面遇到了一个有意思的SQL阻塞(SQL Blocking)案例.其实个人对SQL Server的阻塞还是颇有研究的.写过好几篇相关文章. 至于这里为什么要总结一下这 ...

  4. Sql Server 2012 的新分页方法分析(offset and fetch) - 转载

    最近在分析 Sql Server 2012 中 offset and fetch 的新特性,发现 offset and fetch 无论语法的简洁还是功能的强大,都是相当相当不错的 其中 offset ...

  5. SQL Server 数据库中关于死锁的分析

    SQL Server数据库发生死锁时不会像Oracle那样自动生成一个跟踪文件.有时可以在[管理]->[当前活动] 里看到阻塞信息(有时SQL Server企业管理器会因为锁太多而没有响应). ...

  6. SQL SERVER:使用工具观察与分析数据库中锁信息

    SQL SERVER 2005可以通过Microsoft SQL Server Management Studio的“管理–>活动监视器”–>“右键”–>“进程信息”,这里呈现连接. ...

  7. SQL Server作业报错特殊案例

    一个作业报错,报错信息如下,从错误信息根本看不出为什么出错,手工运行作业又成功了.一时不清楚什么原因导致作业出错. Message Executed as user: NT SERVICE\SQLSE ...

  8. SQL Server数据库邮件发送异常案例

      最近遇到两起关于SQL Server数据库邮件发送异常的案例,这些问题也有点意思,顺便记录一下.方便以后遇到类似问题的人参考,不要被这些问题弄得抓狂! 案例1:我们一台数据库服务器突然发送邮件都不 ...

  9. SQL Server 2012中LEAD函数简单分析

    LEAD函数简单点说,就是把下一行的某列数据提取到当前行来显示,看示例更能解释清楚,先看测试用脚本 DECLARE @TestData TABLE( ID INT IDENTITY(1,1), Dep ...

随机推荐

  1. 转载:SharePoint 2010 自定义 字段 类型--------省市区联动

    最近有几个朋友问到了有关自定义字段类型的问题,为了让更多的人了解自定义字段类型的方法,特写一篇博客与大家分享,首先看一下解决方案目录 创建自定义类型分以下几个步骤: 第一步:添加SharePoint映 ...

  2. 如何将Eclipse中编写的java项目导出?

    转自:https://zhidao.baidu.com/question/347808396.html1.导入项目 当下载了包含Eclipse 项目的源代码文件后,我们可以把它导入到当前的Eclips ...

  3. pow()函数的精度问题

    妈蛋这个坑了我大半个小时都想不出个原因..后来看到pow的定义才想起,数据类型很重要啊.. 1.底数用常量,指数用整型 #include <stdio.h> #include <ma ...

  4. 使用VSTO写的一个工作证打印软件

    转行做HR近2年.最近公司要做工牌,工牌上要打印照片,姓名,工号和部门等信息.一共1000多人,如果手工排版手工打印的话,估计要死人. 于是coding的老毛病又犯了,想写个程序来打印工牌.还是拿最近 ...

  5. Android 自定义ViewGroup 实战篇 -> 实现FlowLayout

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38352503 ,本文出自[张鸿洋的博客] 1.概述 上一篇已经基本给大家介绍了如 ...

  6. view如何从action中取得数据和 Html辅助方法

    方式:1使用弱类型取,2,使用强类型,两者的差别在于view页面最上方声明的方式   如果使用弱类型接受来自控制器的数据,在view页面里完全不需要有任何的生命,数据可以从ViewData,ViewB ...

  7. AS负责人说不必用Kotlin重写,但OkHttp拿Kotlin重写了一遍,就发了OkHttp 4.0!

    虽然 Android Studio 的负责人 Jeffery 已经澄清,只是 Kotlin-First 而不是 Kotlin-Must,并不需要将 App 用 Kotlin 重写一遍.但是 OkHtt ...

  8. 无监督学习:Linear Dimension Reduction(线性降维)

    一 Unsupervised Learning 把Unsupervised Learning分为两大类: 化繁为简:有很多种input,进行抽象化处理,只有input没有output 无中生有:随机给 ...

  9. [51nod] 1091 线段的重叠 贪心

    X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 20]和[12 25]的重叠部分为[12 20]. 给出N条线段的起点和终点,从中选出2条线段,这两条线段的重叠部分是最长 ...

  10. 【Ionic+AngularJS 开发】之『个人日常管理』App(一)

      写在前面的话 过去一年自己接触了不少手机前端开发,得益于现在手机性能的提升和4G普及,感觉使用混合技术开发手机App已经可以满足越来越多的应用场景了.新年伊始,对自己2016年所学知识做一个阶段性 ...