2

現在、私の Windows サービスは 1 日に約 1500 のトランザクションを処理しています。約 1 週間に 1 回、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,

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();
                }
            }
4

3 に答える 3

2

タイムアウトを防ぐために、コマンドを実行するためにより多くの時間を与える必要があります。これは、次の方法で行うことができます。

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

運が良ければ、追跡するのにいくらかの作業が必要になります。あなたが 1 日 1500 回の作業を行っていて、これらを 1 週間に 1 回取得しているとすれば、Greg H の提案に従い、それが発生した場合に対処します。

デフォルトの接続タイムアウトは 60 秒、デフォルトのコマンド タイムアウトは 15 秒です。それが接続障害だった場合、ほぼ同時に同じ理由で他の操作が失敗することが予想されます。コマンドのタイムアウトを増やすこともできますが、それは私の意見では症状の修正であり、実用的な解決策ですが、問題の性質上、サーバーの負荷を増やすと事態が悪化することが示唆されており、その場合、事態はおかしくなる可能性があります.

私は、テーブル、特に集約関数で何か大きなことをする関数を見ています。それらの周りにある種のトレースログを配置すると、絞り込むのに役立つ場合があります。ただし、5 日間の運用で 7500 分の 1 の故障率であることを考えると、労力を費やす価値があるかどうかは確かに疑問です。7日間で10,000分の1...

ちなみに、このテーブルにトリガーはありますか?もしそうなら、それらは一見の価値があります.

于 2012-07-12T12:13:26.050 に答える
0

SQL Server が操作を実行するのにかかる時間はさまざまです。(INSERT特に、予想以上の作業が必要になる場合があります。) タイムアウトの概念には理由があります。

したがって、タイムアウトはコードで対処する必要があるというのが答えだと思います。タイムアウト値を大きくすると、例外が発生する頻度が低くなります。ただし、おそらく例外をキャッチして、挿入を再試行したり、エラー状態をユーザーに伝えたりするなど、合理的なことを行う必要があります。

于 2012-07-12T11:59:26.727 に答える