2011-09-21 79 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