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是由於什么原因沒有提交或回滾事務就不得而知。這個例子完美的演示並重現了這個問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM