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 의 차단 과 잠 금 문 제 를 해결 합 니 다.

좋은 웹페이지 즐겨찾기