錯誤 1222 已超過了鎖請求超時時段

2021-09-25 05:39:08 字數 3717 閱讀 4098

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

【問題原因】

重新整理當前活動將呼叫

sp_msset_current_activity

儲存過程。在定義該儲存過程時,首先將

lock_timeout

變數設定為

5000 毫秒(

ms)。然後,會建立兩個全域性臨時表,它們針對下面的系統表在表級別發出

ix 鎖,在鍵級別發出

x 鎖:

tempdb..sysobjects

tempdb..sysindexes

tempdb..syscolumns

如果在5000 毫秒(

ms)內未將前面的鎖授予該程序,則查詢將停止,並出現「症狀

」一節中顯示的錯誤資訊。

再重新整理一次通常會成功。但是,如果保持這兩個鎖的時間太長,則也會顯示該錯誤資訊。如果執行

sp_lock

儲存過程,則可計算出哪個程序正在對

dbid 2 (tempdb)

的物件id 1

、和3

保持鎖定。

詳細見:

【解決方法】

1.檢視鎖資訊

create

table   #t(req_spid   int

,obj_name   sysname)

declare   @s   nvarchar

(4000)

,@rid   int

,@dbname   sysname

,@id   int

,@objname   sysname

declare   tb   cursor

forselect

distinct   req_spid,dbname=

db_name

(rsc_dbid),rsc_objid  

from   master..syslockinfo   where   rsc_type   in(4,5)

open   tb  

fetch   next   from   tb   into   @rid,@dbname,@id  

while

@@fetch_status

=0  

begin

set   @s=

'select   @objname=name   from   ['

+@dbname+

']..sysobjects   where   id=@id'

exec

sp_executesql   @s,n'@objname   sysname   out,@id   int'

,@objname   out,@id  

insert

into   #t   values

(@rid,@objname)

fetch   next   from   tb   into   @rid,@dbname,@id  

endclose   tb  

deallocate   tb   

select

程序id=a.req_spid   ,

資料庫=

db_name

(rsc_dbid),型別

=case

rsc_type   when   1   then

'null  

資源(未使用)'

when   2   then

'資料庫'

when   3   then'檔案

' when   4   then'索引

' when   5   then'表

' when   6   then'頁

' when   7   then'鍵

' when   8   then

'擴充套件盤區'

when   9   then

'rid

(行id)'

when   10   then

'應用程式'

end,

物件id=rsc_objid   ,

物件名=

b.obj_name  

,rsc_indid  

from   master..syslockinfo   a   left

join   #t   b   on   a.req_spid=b.req_spid  

go  

drop

table   #t  

2.殺掉相應資料庫的程序

create

proc sp_killallprocessindb

@dbname varchar

(100)as

ifdb_id

(@dbname)

=null

begin

print

'database dose not exist'

end

else

begin

declare

@spid varchar

(30)

declare

tmpcursor cursor

forselect

'kill '

+convert

(varchar

, spid)

as spid

from

master..sysprocesses

where

db_name

(dbid)

= @dbname

andspid <>

@@spid

anddbid <> 0

open

tmpcursor

fetch

next from tmpcursor

into

@spid

while

@@fetch_status

= 0

begin

exec

(@spid)

fetch

next from tmpcursor

into

@spid

end

close

tmpcursor

deallocate

tmpcursor

end

go --to execute

exec

dbo.sp_killallprocessindb 'dbname'

然後就可以重新整理資料庫的表與儲存過程了。

[注]:該方法也適用於資料庫強制還原

3sp_lock

錯誤 1222 已超過了鎖請求超時時段

問題原因 重新整理當前活動將呼叫 sp msset current activity 儲存過程。在定義該儲存過程時,首先將 lock timeout 變數設定為 5000 毫秒 ms 然後,會建立兩個全域性臨時表,它們針對下面的系統表在表級別發出 ix 鎖,在鍵級別發出 x 鎖 tempdb.sys...

異常 1222 已超過了鎖請求超時時段

1.解釋 應該是你的表體積很大,處理的時候費事,因為幾乎所有資料庫操作都需要加或多或少的鎖,所以會超時。首先你可以使用select from sys.sysprocesses where blocked 0查查有哪些程序阻塞了。然後拿spid,執行dbcc inputbuffer spid 來檢查是...

已超過了鎖請求超時時段的原因

應該是你的表體積很大,處理的時候費事,因為幾乎所有資料庫操作都需要加或多或少的鎖,所以會超時。首先你可以使用select from sys.sysprocesses where blocked 0查查有哪些程序阻塞了。然後拿spid,執行dbcc inputbuffer spid 來檢查是什麼語句造...