2013-07-08 32 views
-1

我有一個表,其模式在某種程度上,如下所示:SQL Server 2012中 - 僵局聚集索引插入

enter image description here

的子ID列是PK,是一個聚集索引。我有一個C#(使用實體框架)應用程序插入(只插入)到這個表中的行。該應用程序是多線程的,我通常有四個線程同時運行,將行插入此表中。有點頻繁,我會得到一個僵局,看起來如下:

enter image description here

我真的被這個迷惑。顯然我陷入了僵局,但我不知道如何。我嚴格執行插入操作,除了我的應用程序外,沒有任何其他進程正在訪問此表。

回答

0

即使插入,也可能會出現死鎖。例如,假設你有CREATE TABLE test23 (id INT NOT NULL PRIMARY KEY);

然後

--Process 1 : 
--1 
BEGIN TRANSACTION; 
INSERT INTO test23(id) VALUES (1); 
-- Process 2: 
--2 
BEGIN TRANSACTION; 
INSERT INTO test23(id) VALUES (2); 


--Process 1 : 
--3  
INSERT INTO test23(id) VALUES (2); 

-- Process 2: 
--4  
INSERT INTO test23(id) VALUES (1); 
--Deadlock! 

既然你沒有提供有關你的表與實際報表的任何細節,這真的很難說,如果是這樣的話,但我希望它會指向你走向正確的方向。

+0

它看起來像你通過插入重複值來實現這一目標?過程1插入值1和2.過程2插入值2和1.這不會發生在我的應用程序中。我不會有多個線程試圖插入重複的PK值。每個線程都嵌入獨特的PK值。 – Hosea146

+0

@ Hosea146:只是一個猜測:它可能是由於鎖定升級 - SQLServer可能決定阻止該頁面(只是猜測) – a1ex07

+0

另外,如果使用'serializable'隔離級別,則可能在以下情況下發生死鎖:process 1 :'從test23中選擇id = 2; insert into test23(id)values(1)',process 2:'select from test23 where id = 1;插入test23(id)值(2)'。 – a1ex07