2011-09-21 116 views
0

我有一個sql server數據庫設置,它接受來自使用線程運行的visual studio應用程序的插入事務。現在事務處於死鎖狀態,我有一個解決方法,當Visual Studio 2010代碼檢測到超時時,它將重新嘗試插入數據。 查看我設置的文本日誌,這種情況經常發生,導致性能問題。 某些在線資源指示查找違規事務並將其殺死,但是如果我的應用程序依賴於數據庫中獲得的結果,而這些結果可能不是選項。有沒有關於如何處理這個問題的建議。我在visual studion 2010中使用了Parallel Taskfactory,所以在任何給定的時間至少有1000個線程在運行?Sql server數據庫事務死鎖; visual studio插入程序

一些代碼來查看:我插入代碼

真的很感激任何想法。

SQL表模式

Table PostFeed 

id   int  
entryid  varchar(100) 
feed  varchar(MAX) 
pubdate  varchar(50) 
authorName nvarchar(100) 
authorId nvarchar(100) 
age   nvarchar(50) 
locale  nvarchar(50) 
pic   nvarchar(50) 
searchterm nvarchar(100) 
dateadded datetime 

PK - entryid + searchterm  

用於插入 存儲過程,以便它插入的一大堆並且依賴於主鍵約束爲欺騙檢查

完整表創建

USE [Feeds] 
GO 
/****** Object: Table [dbo].[PostFeed] Script Date: 09/21/2011 11:21:38 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[PostFeed](
[id] [int] IDENTITY(1,1) NOT NULL, 
[entryId] [varchar](100) NOT NULL, 
[feed] [varchar](max) NULL, 
[entryContent] [nvarchar](max) NULL, 
[pubDate] [varchar](50) NOT NULL, 
[authorName] [nvarchar](100) NOT NULL, 
[authorId] [nvarchar](100) NULL, 
[age] [nvarchar](50) NULL, 
[sex] [nvarchar](50) NULL, 
[locale] [nvarchar](50) NULL, 
[pic] [nvarchar](100) NULL, 
[fanPage] [nvarchar](400) NULL, 
[faceTitle] [nvarchar](100) NULL, 
[feedtype] [varchar](50) NULL, 
[searchterm] [nvarchar](400) NOT NULL, 
[clientId] [nvarchar](100) NULL, 
[dateadded] [datetime] NULL, 
[matchfound] [nvarchar](50) NULL, 
[hashField] AS ([dbo].[getMd5Hash]([entryId])), 
    CONSTRAINT [PK_Feed] PRIMARY KEY CLUSTERED 
(
[entryId] ASC, 
[searchterm] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
IGNORE_DUP_KEY = OFF,  ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO SET ANSI_PADDING OFF 
GO 

我試圖導出死鎖圖,無法讓它工作,所以這裏有幾條線從跟蹤

Lock:Timeout 60468  sa 0X01 247 G01 sa 2011-09- 21 16:00:44.750 1:4557807 3463314605 .Net SqlClient Data Provider 0 0XEF8B45000100000000000000070006 22164 7 postFeeds 0 2011-09-21 16:00:44.750 1 G02  0 - LOCK 8 - IX   0 72057594075152384 1 - TRANSACTION 0 6 - PAGE   
Lock:Timeout 60469  sa 0X01 478 G01 sa 2011-09- 21 16:00:44.887 (7bf23fc490ce) 3463299315 .Net SqlClient Data Provider 0 0X3802000000017BF23FC490CE070007 17900 7 postFeeds 0 2011-09-21 16:00:44.887 1 G02  0 - LOCK 5 - X   0 72057594075152384 1 - TRANSACTION 0 7 - KEY  
Lock:Timeout 60470  sa 0X01 803 G01 sa 2011-09- 21 16:00:44.887 (379349b72c77) 3463296982 .Net SqlClient Data Provider 0 0X380200000001379349B72C77070007 17900 7 postFeeds 0 2011-09-21 16:00:44.887 1 G02  0 - LOCK 5 - X   0 72057594075152384 1 - TRANSACTION 0 7 - KEY  
Lock:Timeout 60471  tdbuser 0X048D73EF643661429B907E6106F78358 93 G01 tdbuser 2011-09-21 16:02:41.333 1:14386936 3463346220 .Net SqlClient Data Provider 0 
+1

需要SQL。正在運行的導致死鎖的表和正在運行的查詢的概要模式。你正在使用什麼[隔離級別](http://www.littlekendra.com/2011/02/08/isoposter/)? [死鎖痕跡](http://msdn.microsoft.com/en-us/library/ms178104.aspx),你做了一個? – billinkc

+0

我沒有指定隔離級別,我認爲它更悲觀。就像我說的我只是重複插入超時。我沒有設置自動死鎖跟蹤,只是手動檢查是否有偶爾的死鎖,並殺死這些。我將重點關注這些。謝謝 – vbNewbie

+0

你的應用程序基本上是在向數據庫插入一大堆內容,而沒有其他的事情(沒有事先做查詢來檢查是否存在或檢索一個id等)來導致死鎖? – billinkc

回答

1

我已經遇到了插入與平行線程的記錄船裝載相同的情況。爲了解決我的問題僵局指定我當插入表鎖...

Insert dbo.MyTable WITH(TABLOCKX) (Column1) 
Values (SomeValue); 

我使用lowel級鎖嘗試,但我仍然有死鎖。 TabLockX的吞吐量減慢了一些,但它仍然比串行插入快了一噸,並且沒有更多的死鎖。

+0

有任何意見感謝讀取一個表鎖並報告回 – vbNewbie