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

2022-05-09 09:39:07 字數 3436 閱讀 3697

【問題原因】

重新整理當前活動將呼叫

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

@snvarchar

(4000)

,@rid

int,@dbname

sysname

,@id

int,@objname

sysname

declare

tbcursor

forselect

distinct

req_spid,dbname=

db_name

(rsc_dbid),rsc_objid

from

master..syslockinfo

where

rsc_type

in(4,5)

open

tbfetch

next

from

tbinto

@rid,@dbname,@id

while

@@fetch_status

=0begin

set@s=

'select@objname=namefrom['

+@dbname+

']..sysobjects whereid=@id'

exec

sp_executesql

@s,n'@objnamesysnameout,@idint'

,@objnameout,@id

insert

into

#tvalues

(@rid,@objname)

fetch

next

from

tbinto

@rid,@dbname,@id

endclose

tbdeallocate

tb select

程序id=a.req_spid

,資料庫

=db_name

(rsc_dbid),型別

=case

rsc_type

when

1then

'null

資源(未使用)

'when

2then

'資料庫

'when

3then'檔案

'when

4then'索引

'when

5then'表

'when

6then'頁

'when

7then'鍵

'when

8then

'擴充套件盤區

'when

9then

'rid

(行id)'

when

10then

'應用程式

'end,物件

id=rsc_objid

,物件名

=b.obj_name

,rsc_indid

from

master..syslockinfoa

left

join#tb

ona.req_spid=b.req_spid

godrop

table

#t2.殺掉相應資料庫的程序

create

proc sp_killallprocessindb

@dbname varchar

(100)

asif

db_id

(@dbname)

=null

begin

print

'database dose not exist'

endelse

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

= 0begin

exec

(@spid)

fetch

next from tmpcursor

into

@spid

endclose

tmpcursor

deallocate

tmpcursor

endgo

--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 來檢查是什麼語句造...