zoukankan      html  css  js  c++  java
  • SQL SERVER错误:已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)

        在SSMS(Microsoft SQL Server Management Studio)里面,查看数据库对应的表的时候,会遇到“Lock Request time out period exceeded.(Microsoft SQL Server, 错误1222)”,对应的中文错误提示为“已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)”,如下截图所示,不管是用一般权限的账号还是具有sysadmin角色的登录名都是如此。

    clipboard

    clipboard[1]

    这个错误有点奇怪,检查该数据库服务器上监控阻塞的告警邮件,发现有Blocking告警,我用下面SQL语句查看,如下截图所示

    clipboard[2]

    如上所示,会话ID为65的语句执行 TRUNCATE TABLE [ESQ_ITEM_PRICE_FOR_DCA],它阻塞了会话ID为60的会话,而会话ID为60的会话是YourSQLDba正在更新统计信息

    set nocount on   ;With     TableSizeStats as   (   select      object_schema_name(Ps.object_id, db_id('ODS')) as scn --collate Chinese_PRC_CI_AS   , object_name(Ps.object_id, db_id('ODS')) as tb --collate Chinese_PRC_CI_AS   , Sum(Ps.Page_count) as Pg  From    sys.dm_db_index_physical_stats (db_id('ODS'), NULL, NULL, NULL, 'LIMITED') Ps  Group by     Ps.object_id    )  Insert into #tableNames (scn, tb, seq, sampling)  Select     scn  , tb  , row_number() over (order by scn, tb) as seq  , Case       When pg > 200001 Then '10'      When Pg between 50001 and 200000 Then '20'      When Pg between 5001 and 50000 Then '30'      else '100'    End    From     TableSizeStats  where (abs(checksum(tb)) % 1) = 0  

    它阻塞了会话ID为68的会话

    SELECT COUNT(1) FROM [ESQ_ITEM_PRICE_FOR_DCA]

    上面这个案例,有两个比较迷惑的地方:

        一:会话ID为65的进程处于Sleeping状态,而且该会话在执行TRUNCATE语句,照理说TRUNCATE应该非常快就执行完了。很是奇怪的是一个TRUNCATE会话处于Sleeping状态,这个会话是从Linux服务器Talend应用程序发出的请求。那么只有一种可能就是该TRUNCATE语句位于事务里面,而该事务由于逻辑原因等一直没有提交或回滚。

        二:SQL阻塞语句居然导致了上面“Lock Request time out period exceeded.(Microsoft SQL Server, 错误1222)”。

    clipboard[3]

    关于上面两个问题,我们可以构造一个案例来看看,在测试数据库TEST里面的按下面步骤就能重新这个错误:

    会话语句1:

    BEGIN TRAN

      TRUNCATE TABLE TEST;

      --ROLLBACK;

     

    会话语句2:

    UPDATE STATISTICS dbo.TEST;

     

    会话语句3:

     

    image 

     

    image

     

    如上所示,会话52处于sleeping状态了。然后你去SSMS里面查看表,就会遇到这个“已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)”错误。至于实际应用程序Talend是由于什么原因没有提交或回滚事务就不得而知。这个例子完美的演示并重现了这个问题

  • 相关阅读:
    JAVA学习之常用集合List,Set,Map
    【收藏】SQL多行变一列
    sql 多个字段分组,删除重复记录,保留ID最小的一条
    【转】 JavaScript:history.go() 的妙用(转) 处理post回发后返回
    【转】SQL SERVER 2005中如何获取日期(一个月的最后一日、上个月第一天、最后一天、一年的第一日等等)
    require.context实现自动化导入文件
    Vue进阶——解析V-MODEL
    ES6 的遍历器接口 Iterator
    必须掌握的ES6新特性
    Vue自定义指令获取DOM元素
  • 原文地址:https://www.cnblogs.com/kerrycode/p/4502164.html
Copyright © 2011-2022 走看看