原文: 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角色的登入名都是如此。 http://images0.cnblogs.com/blog/73542/201505/221217549638455.png http://images0.cnblogs.com/blog/73542/201505/221217563223970.png 這個錯誤有點奇怪,檢查該資料庫伺服器上監控阻塞的告警郵件,發現有Blocking告警,我用下面SQL語句檢視,如下截圖所示 http://images0.cnblogs.com/blog/73542/201505/221217577298200.png 如上所示,會話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)”。
http://images0.cnblogs.com/blog/73542/201505/221217594003744.png關于上面兩個問題,我們可以構造一個案例來看看,在測試資料庫TEST裡面的按下面步驟就能重新這個錯誤:
會話語句1:
BEGIN TRAN
TRUNCATE TABLE TEST;
--ROLLBACK;
會話語句2:
UPDATE STATISTICS dbo.TEST;
會話語句3:
如上所示,會話52處于sleeping狀态了。然後你去SSMS裡面檢視表,就會遇到這個“已超過了鎖請求逾時時段。 (Microsoft SQL Server,錯誤: 1222)”錯誤。至于實際應用程式Talend是由于什麼原因沒有送出或復原事務就不得而知。這個例子完美的示範并重制了這個問題