2

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

例外是:

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,

约束 [PK_TransactionLogging] 主键集群([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();
                }
            }
4

3 回答 3

2

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

 using(var db = new DataContext()) 
   { 
      db.CommandTimeout = 60; // seconds
      // your queries ...   
} 
于 2012-07-12T12:08:35.503 回答
0

除非你很幸运,否则这将需要一些工作才能找到。鉴于您每天要做 1500 次,而您每周都会获得其中一次,我会按照 Greg H 的建议去做,并在发生时处理它。

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

我将研究对表格执行重大操作的函数,尤其是聚合函数。在它们周围放置某种跟踪日志可能会帮助您缩小范围。Definitley 想知道这是否值得付出努力,因为您在五天的操作中的失败率是 7500 分之一。在 7 天之内,万分之一...

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

于 2012-07-12T12:13:26.050 回答
0

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

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

于 2012-07-12T11:59:26.727 回答