我有一個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
需要SQL。正在運行的導致死鎖的表和正在運行的查詢的概要模式。你正在使用什麼[隔離級別](http://www.littlekendra.com/2011/02/08/isoposter/)? [死鎖痕跡](http://msdn.microsoft.com/en-us/library/ms178104.aspx),你做了一個? – billinkc
我沒有指定隔離級別,我認爲它更悲觀。就像我說的我只是重複插入超時。我沒有設置自動死鎖跟蹤,只是手動檢查是否有偶爾的死鎖,並殺死這些。我將重點關注這些。謝謝 – vbNewbie
你的應用程序基本上是在向數據庫插入一大堆內容,而沒有其他的事情(沒有事先做查詢來檢查是否存在或檢索一個id等)來導致死鎖? – billinkc