2010-06-08 107 views
0

我正在使用SQL Server 2008 Enterprise。我曾嘗試過,如果我將SQL Server事務日誌設置爲增加相關數據庫(沒有備份設置),那麼如果同時由多個線程執行,此存儲過程的單個刪除語句將導致死鎖?任何想法爲什麼?當SQL Server事務日誌不斷增加時出現死鎖?

對於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

它是否真的是死鎖(一個線程被中止爲死鎖受害者),還是僅僅是一個「延遲「,直到第一個線程完成? – 2010-06-08 16:10:41

+3

喬治,這是你第三次詢問有關同樣的僵局,從未提供過死鎖信息。沒有死鎖信息,你正在浪費你的時間。附加事件探查器,監視死鎖圖形事件類* *,等待發生死鎖,將保存的.xdl附加到您的文章。 – 2010-06-08 17:48:27

+0

@馬克,它是僵局。我在日誌中記錄它。事務日誌之間的任何關係不斷增加和死鎖? – George2 2010-06-09 03:30:33

回答

4

作爲一個經驗法則,您應該始終在具有FOREIGN KEY約束的列上創建一個索引。否則,死鎖很可能發生(因爲服務器必須鎖定整個從屬表以確保約束)

+0

任何想法爲什麼如果事務日誌不斷增加會發生死鎖? – George2 2010-06-09 03:29:48

+1

否... SQL服務器遇到打開的事務後,事務日誌完成。 – a1ex07 2010-06-09 15:14:19

+0

謝謝,問題回答! – George2 2010-06-09 16:10:12