最近发现一个非常奇怪的阻塞问题,如下截图所示(来自监控工具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. c# winform DataGridView 单元格的屏幕位置

    首先取得DataGridView的坐标位置:int dgvX = dataGridView1.Location.X;int dgvY = dataGridView1.Location.Y;然后取得选中 ...

  2. 《SpringBoot揭秘 快速构建微服务体系》读后感(一)

    SpringIOC IOC有两种方式:一种是DI,另一种是DL,即Dependency Lookup(依赖查找).前者是当前软件实体被动接受其依赖的其他组件被IoC容器注入,而后者则是当前软件实体主动 ...

  3. HDU - 6025 Coprime Sequence(gcd+前缀后缀)

    Do you know what is called ``Coprime Sequence''? That is a sequence consists of nnpositive integers, ...

  4. Spring Security认证提供程序

    1.简介 本教程将介绍如何在Spring Security中设置身份验证提供程序,与使用简单UserDetailsService的标准方案相比,提供了额外的灵活性. 2. The Authentica ...

  5. 洛谷 - P2324 - 骑士精神 - A*搜索

    为什么估价是16,因为最后一步复原空格可以恢复两个位置,当然设成17.18都可以. #include<bits/stdc++.h> using namespace std; typedef ...

  6. 51nod1113【矩阵快速幂】

    思路: 裸的矩阵快速幂,读完题,感觉有点对不起四级算法题这一类. #include<bits/stdc++.h> using namespace std; typedef long lon ...

  7. ue4 bp singleton

    .h UCLASS(Blueprintable) class USingletonBP: public UObject { GENERATED_UCLASS_BODY() /** * Singleto ...

  8. IT兄弟连 JavaWeb教程 AJAX常见问题

    1  中文乱码问题 ●  POST提交乱码 乱码原因:所有浏览器对Ajax请求参数都使用UTF-8进行编码,而服务器默认使用ISO-8859-1去解码,所以产生乱码. 解决方法:在服务器接收请求参数前 ...

  9. Java无模板导出Excel,Apache-POI插件实现

    开发环境 jdk 1.8 Maven 3.6 Tomcat 8.5 SpringBoot 2.1.4.RELEASE Apache-POI 3.6 Idea 注意: 我是在现有的基于SpringBoo ...

  10. jsp学习与提高(四)——JSP Session 处理

    JSP Session HTTP是无状态协议,这意味着每次客户端检索网页时,都要单独打开一个服务器连接,因此服务器不会记录下先前客户端请求的任何信息. 有三种方法来维持客户端与服务器的会话: Cook ...