SQL Server 2008-Insert Linq查询出现SQL超时异常



目前,我的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();

关于如何诊断这个问题,有什么想法/建议吗??

非常感谢你的帮助,Fiona

更新

表格结构为:

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]主键集群(ASC)其中(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=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();
                }
            }

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

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

好吧,SQL Server可能需要可变的时间来执行一个操作。(尤其是INSERT可能需要比您预期的更多的工作。)超时的概念是有原因的。

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

除非你运气好,否则需要一些工作才能找到。考虑到你每天要做1500次,而你每周都要做一次,我会按照Greg H的建议去做,并在发生时处理它。

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

我会研究那些对表有重大作用的函数,尤其是聚合函数。在它们周围放置某种跟踪日志可能有助于缩小范围。考虑到你在五天的手术中有1/7500的失败率,我想知道这是否值得付出努力。万分之一的人在7天内。。。

顺便说一句,这个表上有触发器吗?如果有,它们值得一看。

最新更新