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