SQL SERVER错误:已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)

摘要:
很是奇怪的是一个TRUNCATE会话处于Sleeping状态,这个会话是从Linux服务器Talend应用程序发出的请求。然后你去SSMS里面查看表,就会遇到这个“已超过了锁请求超时时段。”错误。至于实际应用程序Talend是由于什么原因没有提交或回滚事务就不得而知。这个例子完美的演示并重现了这个问题解决方法:1.通过SQL命令行,查看是否有sleeping死锁进程占用了资源,使正常的请求无法得到及时响应。

在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 Groupby Ps.object_id ) Insert into #tableNames (scn, tb, seq, sampling) Select scn , tb , row_number() over (orderby 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是由于什么原因没有提交或回滚事务就不得而知。这个例子完美的演示并重现了这个问题

解决方法:

1.通过SQL命令行,查看是否有sleeping死锁进程占用了资源,使正常的请求无法得到及时响应。

select *
FROM master..SysProcesses
WHERE db_Name(dbID) = '数据库名'
and spId <> @@SpId
and dbID <> 0
and blocked >0;

2.执行Kill进程命令,解锁进程,释放资源.
EXEC('Kill','2973')
KILL 2973

免责声明:文章转载自《SQL SERVER错误:已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Mybatis3源码笔记(一)环境搭建Jmeter发送https请求下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

无法启动链接服务器"XXX DB Link"的 OLE DB 访问接口 "SQLNCLI11" 的嵌套事务。由于 XACT_ABORT 选项已设置为 OFF,因此必须使用嵌套事务。链接服务器"XXX DB Link"的 OLE DB 访问接口 "SQLNCLI11" 返回了消息"无法在此会话中启动更多的事务"。

无法启动链接服务器"XXX DB Link"的 OLE DB 访问接口 "SQLNCLI11" 的嵌套事务。由于 XACT_ABORT 选项已设置为 OFF,因此必须使用嵌套事务。链接服务器"XXX DB Link"的 OLE DB 访问接口 "SQLNCLI11" 返回了消息"无法在此会话中启动更多的事务"。 【以上问题待解决】 临时解决方案:暂时先避免...

使用 Visual Studio Code 创建并运行 Transact SQL 脚本

原文:https://docs.microsoft.com/zh-cn/sql/tools/visual-studio-code/sql-server-develop-use-vscode?view=sql-server-ver15 适用于:SQL Server(所有支持的版本) - Linux 本文介绍如何为 Visual Studio Code 使...

NVMe概述

目前企业SSD市场按照接口协议主要分为SATA SSD,PCIe SSD和NVMe SSD,其中SATA SSD沿用了传统的HDD使用的SATA协议,在企业应用和服务器兼容性上具有优势;而PCIe SSD则一般使用私有协议,目前已经处于比较小众的产品;NVMe SSD则在PCIe接口上使用新的标准协议NVMe,由于NVMe由大厂Intel推出并交由nvme...

导航菜单交叉移动

<style>#menuShow{border: 1px solid #6cccc6;background-color: #11cccc;padding: 13px;font-size: 13px;font-family: Verdana, Arial;position: absolute;auto;height: auto;}#menuSel...

MATLAB拟合和插值

定义 插值和拟合: 曲线拟合是指您拥有散点数据集并找到最适合数据一般形状的线(或曲线)。 插值是指您有两个数据点并想知道两者之间的值是什么。中间的一半是他们的平均值,但如果你只想知道两者之间的四分之一,你必须插值。   拟合 我们着手写一个线性方程图的拟合: y=3x^3+2x^2+x+2 首先我们生成一组数据来分析: x=-5:0.5:5; e=50*r...