这样的存储过程会导致死锁吗?

时间:2010-06-04 15:25:39

标签: sql-server-2008 deadlock

我正在使用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  
提前谢谢, 乔治

2 个答案:

答案 0 :(得分:2)

回答问题的唯一可靠方法是run your own stress tests

答案 1 :(得分:1)

您提供的代码可能导致死锁。即使存储过程完全由以下语句组成,也可能发生死锁。

   DELETE FooTable WHERE  Param1 = @Param1

取决于确切的表格定义和可用的索引(您在问题中遗漏了这些内容)。