тупик, когда журнал транзакций SQL Server постоянно увеличивается? - PullRequest
0 голосов
/ 08 июня 2010

Я использую SQL Server 2008 Enterprise.Я пытался, что если я установлю когда-либо увеличение журнала транзакций SQL Server для связанной базы данных (без параметров резервного копирования), то один оператор удаления этой хранимой процедуры вызовет взаимоблокировку, если выполняется несколькими потоками одновременно?Есть идеи, почему?

Для оператора delete Param1 - это столбец таблицы FooTable, Param1 - это внешний ключ другой таблицы (относится к другому столбцу кластеризованного индекса первичного ключа другой таблицы).Для самой таблицы Param1 нет индекса для таблицы FooTable.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 Ответ

4 голосов
/ 08 июня 2010

Как правило, всегда следует создавать индекс для столбца с ограничением FOREIGN KEY.В противном случае очень вероятно возникновение взаимоблокировки (поскольку сервер должен заблокировать всю зависимую таблицу, чтобы обеспечить это ограничение)

...