2010-06-04 9 views
0

SQL Server 2008 Enterprise를 사용하고 있습니다. 같은 시간에 여러 스레드에 의해 실행되는 경우이 저장 프로 시저가 교착 상태를 일으키는 지 궁금합니다. 또 다른 질문은 - 스토어드 프로 시저 내에서 트랜잭션 시작 및 종료를 정의하거나 클라이언트 코드 (예 : ADO.Net 코드)에서 시작 및 종료 트랜잭션을 정의하는 것이 가장 좋습니다. 사전에그런 저장 프로 시저가 교착 상태를 유발합니까?

create PROCEDURE [dbo].[FooProc]  
( 
@Param1 int 
,@Param2 int 
,@Param3 int 
)  
AS  

DELETE FooTable WHERE Param1 = @Param1  

INSERT INTO FooTable  
( 
Param1 
,Param2 
,Param3 
)  
VALUES  
( 
@Param1 
,@Param2 
,@Param3 
)  

DECLARE @ID bigint  
SET @ID = ISNULL(@@Identity,-1)  
IF @ID > 0  
BEGIN  
     SELECT IdentityStr FROM FooTable WHERE ID = @ID 
END 

덕분에,

+1

이다? 또한 @@ Identity는 피해야합니다. SCOPE_IDENTIY 사용 –

+0

예, 현재 레거시 코드의 일부 문제를 분석하고 있으며이 저장 프로 시저로 인해 교착 상태가 발생했는지 분석해야합니다. 내 원래 질문에 대한 아이디어 나 의견이 있으십니까? – George2

+0

"@@ 신원은 피해야합니다"- 이유는 무엇입니까? – George2

답변

1

조지 당신이 원인 교착 준 코드입니다. 저장 프로 시저가 순전히 다음 명령문 교착 상태로 구성 되어도 발생할 수 있습니다.

DELETE FooTable WHERE Param1 = @Param1 

정확한 테이블 정의 및 사용할 수있는 색인 (질문에서 제외 했음)에 따라 다릅니다.

+0

왜이 delete 문을 구성하면 교착 상태가 발생합니까? 더 자세한 내용은? 교착 상태에 대해 Param1에 색인이 있는지 여부가 중요한지 궁금합니다. – George2

+1

글쎄, 내가 생각했던 방식은 저장 프로 시저의 호출 1이 페이지 x, y, z에 페이지 잠금을 얻는 것을 끝내지 만 페이지가 필요하다고 가정했다. 스토어드 프로 시저의 호출 2는 페이지 a, b, c에 페이지 잠금을 가져 오지만 페이지 x가 필요하므로 교착 상태가 발생합니다. –

+0

내 견해로 샘플을 보여 주실 수 있습니까? :-) 예 : delete 문에서 페이지 x, y, z 및 a, b, c는 어떤 페이지입니까? 하나의 delete 문이 너무 많은 페이지를 포함하는 이유는 무엇입니까? – George2

2

가 귀하의 질문에 대답하는 신뢰할 수있는 유일한 방법은 SQL 2008에서 무엇을해야 병합합니다 run your own stress tests

+0

죄송합니다. 질문은 명확하지 않습니다. 여기에서 더 자세히 설명해주십시오. http://stackoverflow.com/questions/2981121/why-single-sql-delete-statement-will-cause-deadlock – George2

관련 문제