<?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
'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'
然後就可以重新整理資料庫的表與儲存過程了。
[注]:該方法也適用於資料庫強制還原
3.sp_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 來檢查是什麼語句造...