天天看點

SQL SERVER錯誤:已超過了鎖請求逾時時段。 (Microsoft SQL Server,錯誤: 1222)

原文: 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:

SQL SERVER錯誤:已超過了鎖請求逾時時段。 (Microsoft SQL Server,錯誤: 1222)
SQL SERVER錯誤:已超過了鎖請求逾時時段。 (Microsoft SQL Server,錯誤: 1222)

如上所示,會話52處于sleeping狀态了。然後你去SSMS裡面檢視表,就會遇到這個“已超過了鎖請求逾時時段。 (Microsoft SQL Server,錯誤: 1222)”錯誤。至于實際應用程式Talend是由于什麼原因沒有送出或復原事務就不得而知。這個例子完美的示範并重制了這個問題