SQL Server 2008 - Insert Linq查询上的SQL超时异常

时间:2012-07-12 11:47:06

标签: sql timeout

目前,我的Windows服务每天处理大约1500次交易。大约每周一次,我在使用LINQ完成的Insert上得到一个随机超时异常。

例外是:

Exception (SqlException) System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

Linq查询是:

dc.TransactionLoggings.InsertOnSubmit(new TransactionLogging()
                    {
                        DateAdded = DateTime.UtcNow,
                        InputMessage = message,
                        DocId = documentID.ToString(),
                        TransactionStatus = transactionStatus
                    });
                    dc.SubmitChanges();

关于如何诊断这个问题的任何想法/建议?

非常感谢你的帮助, 菲奥娜

更新

表结构是:

CREATE TABLE [dbo].[TransactionLogging](
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[InputMessage] [nvarchar](max) NULL,
[CCHMessage] [nvarchar](max) NULL,
[DocId] [char](20) NOT NULL,
[TransactionStatus] [char](5) NOT NULL,
[DateAdded] [datetime] NULL,
[LastUpdate] [datetime] NULL,
[SentDate] [datetime] NULL,

CONSTRAINT [PK_TransactionLogging] PRIMARY KEY CLUSTERED (     [ID] ASC )WITH(PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON)ON [PRIMARY] )ON [PRIMARY

此外,当天的第一笔交易发生了2次最近的交易超时。这肯定不是巧合!

还想知道是否有人对我的代码的以下更新有任何想法:

有任何意见吗?!!!

 using (MiddlewareDBDataContext dc = new MiddlewareDBDataContext(ConfigurationWrapper.ActivityLoggingDatabase_ConnectionString))
            {

                dc.TransactionLoggings.InsertOnSubmit(new TransactionLogging()
                {
                    DateAdded = DateTime.UtcNow,
                    InputMessage = message,
                    DocId = documentID.ToString(),
                    TransactionStatus = transactionStatus
                });
                try
                {
                    dc.SubmitChanges();
                }
                catch (SqlException ex)
                {
                    //Wait for 30 seconds then retry..
                    System.Threading.Thread.Sleep(30000);
                    dc.SubmitChanges();
                }
            }

3 个答案:

答案 0 :(得分:2)

您应该给予更多时间执行命令以防止超时。这可以通过以下方式完成:

 using(var db = new DataContext()) 
   { 
      db.CommandTimeout = 60; // seconds
      // your queries ...   
} 

答案 1 :(得分:0)

好吧,SQL Server可能需要不同的时间来执行操作。 (特别是INSERT可能需要比预期更多的工作。)超时的概念是有原因的。

所以我认为答案是超时是您的代码需要处理的现实。您可以增加超时值,这样可以减少异常的频率。但是,您应该捕获异常并做一些合理的事情,例如尝试再次插入和/或将错误条件转发给用户。

答案 2 :(得分:0)

除非你很幸运,否则需要做一些工作来追查。鉴于你每天做1500次并且你每周都会得到其中一个,我会选择Greg H所建议的并在碰巧时处理它。

默认连接超时为60秒,默认命令超时为15秒。如果是连接失败,我希望看到其他一些操作在同一时间出于同样的原因而失败。你可以增加命令超时,但在我看来这是一个症状修复,一个实用的解决方案,但问题的本质表明,如果你增加服务器的负载,它会变得更糟,在这种情况下,thinng可能会变得愚蠢

我正在研究那些与表格有关的功能,尤其是聚合功能。在它们周围放置某种跟踪日志可能会帮助您缩小范围。鉴于你在五天的运作中有7500的失败率,Definitley想知道这是否值得付出努力。 7天内每10,000人中有1人......

顺便说一下,这张桌子上是否有任何触发器,如果​​是这样,他们将值得一看。