2010-06-04 96 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

將合併你在2008年SQL需要什麼?也應該避免使用@@身份。使用SCOPE_IDENTIY – 2010-06-04 15:28:43

+0

是的,我正在分析遺留代碼的一些問題,並且我需要分析死鎖是否由此存儲過程引起。任何關於我原來的問題的想法或意見? – George2 2010-06-04 15:40:29

+0

「@@身份應該避免」 - 爲什麼? – George2 2010-06-04 15:41:11

回答

1

你給導致死鎖的代碼。即使存儲過程純粹由以下語句死鎖組成。

DELETE FooTable WHERE Param1 = @Param1 

根據確切的表定義和索引可用(你沒有問你的問題)。

+0

爲什麼包含這個delete語句會導致死鎖?更多細節?我想知道爲什麼它關於Param1上的索引是否存在死鎖? – George2 2010-06-04 16:11:27

+1

那麼我想的方式是假設存儲過程的調用1最終在頁面x,y,z上獲得頁面鎖定,但需要頁面a。存儲過程的調用2最終在頁面a,b,c上獲得頁面鎖定,但是需要頁面x然後會發生死鎖。 – 2010-06-04 16:14:57

+0

你能告訴我樣品嗎? :-)例如在刪除語句中,頁面x,y,z和a,b,c是哪個頁面?爲什麼單個刪除語句會涉及如此多的頁面? – George2 2010-06-04 16:21:00

2

的唯一可靠的方式來回答你的問題是run your own stress tests

+0

對不起Alex,問題不是很清楚。請在這裏討論,我對此有更清晰的描述。 http://stackoverflow.com/questions/2981121/why-single-sql-delete-statement-will-cause-deadlock – George2 2010-06-05 16:31:36