SQL Server事务日志不断增加时的死锁?

时间:2010-06-08 16:00:24

标签: c# .net sql-server-2008 deadlock

我正在使用SQL Server 2008 Enterprise。我已经尝试过,如果我将SQL Server事务日志设置为相关数据库的增加(没有备份设置),那么如果多个线程同时执行此存储过程的单个delete语句将导致死锁?有什么想法吗?

对于delete语句,Param1是表FooTable的列,Param1是另一个表的外键(指另一个表的另一个主键聚簇索引列)。对于表FooTable,Param1本身没有索引。 FooTable有另一列用作聚簇主键,但不是Param1列。

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 个答案:

答案 0 :(得分:4)

根据经验,您应该始终在具有FOREIGN KEY约束的列上创建索引。否则,很可能发生死锁(因为服务器必须锁定整个依赖表以确保约束)