Sql server数据库事务死锁;Visual studio插入程序



我有一个sql server数据库设置,它接受来自使用线程运行的visual studio应用程序的插入事务。现在事务正在陷入死锁,我有一个解决方案,当visual studio 2010代码检测到超时时,它将重新尝试插入数据。看看我的文本日志,我已经设置,这是发生的方式太频繁,导致性能问题。一些在线资源指示查找违规事务并杀死它,但如果我的应用程序依赖于数据库中获得的结果,那么这可能不是一个选项。对于如何处理这个问题,有什么建议吗?我在visual studio 2010中使用并行任务工厂,所以在任何给定的时间至少有1000个线程运行?

查看代码:my insert code

任何想法都非常感谢。

sql table schema

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

我尝试导出死锁图形,无法使其工作,所以这里有几行来自trace

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   

我遇到过同样的情况,插入了大量带有并行线程的记录。为了解决死锁问题,我在插入时指定了一个表锁。

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

我尝试使用低级锁,但我仍然得到死锁。TabLockX在一定程度上降低了吞吐量,但它仍然比串行插入快得多,而且没有更多的死锁。

最新更新