程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> sql server 2000壅塞和逝世鎖成績的檢查與處理辦法

sql server 2000壅塞和逝世鎖成績的檢查與處理辦法

編輯:MSSQL

sql server 2000壅塞和逝世鎖成績的檢查與處理辦法。本站提示廣大學習愛好者:(sql server 2000壅塞和逝世鎖成績的檢查與處理辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是sql server 2000壅塞和逝世鎖成績的檢查與處理辦法正文


數據庫產生壅塞和逝世鎖的景象:

1、數據庫壅塞的景象:第一個銜接占領資本沒有釋放,而第二個銜接須要獲得這個資本。假如第一個銜接沒有提交或許回滾,第二個銜接會一向期待下去,直到第一個銜接釋放該資本為止。關於壅塞,數據庫沒法處置,所以對數據庫操作要實時地提交或許回滾。
2、數據庫逝世鎖的景象:第一個銜接占領資本沒有釋放,預備獲得第二個銜接所占用的資本,而第二個銜接占領資本沒有釋放,預備獲得第一個銜接所占用的資本。這類相互占領對方須要獲得的資本的景象叫做逝世鎖。關於逝世鎖,數據庫處置辦法:就義一個銜接,包管別的一個銜接勝利履行。

例如,一個客戶端運用法式線程有兩個開放式銜接。該線程異步啟動事務並在第一個銜接上收回查詢。運用法式隨後啟動其它事務,在另外一個銜接上收回查詢並期待成果。當 SQL   Server   前往個中一個銜接的成果時,運用法式開端處置這些成果。運用法式就如許處置成果,直到生成成果的查詢被另外一個銜接上履行的查詢壅塞而招致再沒有可用的成果為止。此時第一個銜接壅塞,無窮期期待處置更多的成果。第二個銜接沒有在鎖上壅塞,但仍試圖將成果前往給運用法式。但是,因為運用法式壅塞而在第一個銜接上期待成果,第二個銜接的成果將得不隨處理。  

上面是檢查並處置sql server 2000壅塞和逝世鎖的辦法:


use master --必需在master數據庫中創立
go
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_lockinfo]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_lockinfo]
GO
/*--處置逝世鎖
檢查以後過程,或逝世鎖過程,並能主動殺失落逝世過程
由於是針對逝世鎖的,所以假如有逝世鎖過程,只能檢查逝世鎖過程
固然,你可以經由過程參數掌握,不論有無逝世鎖,都只檢查逝世鎖過程
*/
/*--挪用示例
exec p_lockinfo
--*/
create proc p_lockinfo
@kill_lock_spid bit=0,   --能否殺失落逝世鎖的過程,1 殺失落, 0 僅顯示
@show_spid_if_nolock bit=1 --假如沒有逝世鎖的過程,能否顯示正常過程信息,1 顯示,0 不顯示
as
set nocount on
declare @count int,@s nvarchar(1000),@i int
select id=identity(int,1,1),標記,
過程ID=spid,線程ID=kpid,塊過程ID=blocked,數據庫ID=dbid,
數據庫名=db_name(dbid),用戶ID=uid,用戶名=loginame,累計CPU時光=cpu,
上岸時光=login_time,翻開事務數=open_tran, 過程狀況=status,
任務站名=hostname,運用法式名=program_name,任務站過程ID=hostprocess,
域名=nt_domain,網卡地址=net_address
into #t from(
select 標記='逝世鎖的過程',
   spid,kpid,a.blocked,dbid,uid,loginame,cpu,login_time,open_tran,
   status,hostname,program_name,hostprocess,nt_domain,net_address,
   s1=a.spid,s2=0
from master..sysprocesses a join (
   select blocked from master..sysprocesses group by blocked
   )b on a.spid=b.blocked where a.blocked=0
union all
select '|_就義品_>',
   spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran,
   status,hostname,program_name,hostprocess,nt_domain,net_address,
   s1=blocked,s2=1
from master..sysprocesses a where blocked<>0
)a order by s1,s2
select @count=@@rowcount,@i=1
if @count=0 and @show_spid_if_nolock=1
begin
insert #t
select 標記='正常的過程',
   spid,kpid,blocked,dbid,db_name(dbid),uid,loginame,cpu,login_time,
   open_tran,status,hostname,program_name,hostprocess,nt_domain,net_address
from master..sysprocesses
set @count=@@rowcount
end
if @count>0
begin
create table #t1(id int identity(1,1),a nvarchar(30),b Int,EventInfo nvarchar(255))
if @kill_lock_spid=1
begin
   declare @spid varchar(10),@標記 varchar(10)
   while @i<=@count
   begin
    select @spid=過程ID,@標記=標記 from #t where id=@i
    insert #t1 exec('dbcc inputbuffer('+@spid+')')
    if @@rowcount=0 insert #t1(a) values(null)
    if @標記='逝世鎖的過程' exec('kill '+@spid)
    set @i=@i+1
   end
end
else
   while @i<=@count
   begin
    select @s='dbcc inputbuffer('+cast(過程ID as varchar)+')' from #t where id=@i
    insert #t1 exec(@s)
    if @@rowcount=0 insert #t1(a) values(null)
    set @i=@i+1
   end
select a.*,過程的SQL語句=b.EventInfo
from #t a join #t1 b on a.id=b.id
order by 過程ID
end
set nocount off
go

經由過程的 Transact-SQL 將處理sql server 2000壅塞和逝世鎖成績

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved