2

非常に奇妙な問題が発生しています。データが適切かつタイムリーに挿入されているにもかかわらず、ストアド プロシージャが返されません。これに関する最も驚くべきことは、レコードのタイム スタンプ フィールドが常にミリ秒以内に入力されるため、データが非常に速くテーブルに取り込まれているように見えることです。しかし、リターンは決して起こりません。

このすべての重要な部分は、負荷がかかった状態でのみ発生するということです。個々のリクエストは問題ありません。DB に十分な負荷がかかっている場合にのみ、このことが起こり始めます。

何が間違っているのかほとんど理解していないので、どんなアイデアでも大歓迎です。

これは単純化された C# の部分です。

try 
{
    using (var conn = new SqlConnection(connString))
    {
        conn.Open();

        using (var cmd = new SqlCommand(conn, ....)
        {
            cmd.CommandType = StoredProcedure;

            cmd.ExecuteNonQuery();

            // THIS NEVER EXECUTES:
            ReportSuccess();
        }
    }
}
catch (TimeoutException)
{
    // EXCEPTION HERE
}

そしてストアドプロシージャ:

CREATE PROCEDURE dbo.Blah
BEGIN
    INSERT dbo.MyTable VALUES (...)

    INSERT dbo.MyTable2...

    -- Here is where everything stops.

END

更新: タイムアウトと SQL サーバーのアクティビティを関連付けるために最善を尽くしましたが、アプリ以外のユーザー アクティビティがロックを引き起こしているようです。このプロセスは、非常に迅速な挿入と非常に迅速な読み取りを可能にするように設計されています。ただし、実際には DIRTY READ ポリシーを使用せずに非常にコストのかかるクエリを実行する人もいましたが、これは脆弱なハードウェアの負荷バランスを崩していました。しかし、すべてのヒントをありがとう。

4

1 に答える 1

1

提供された情報に基づいて、ストアド プロシージャに偶発的な問題があると推測されます。

ストアド プロシージャでトランザクションを使用してみてください。私の理論が正しければ、レコードは挿入されません。

MyTable2 で取得中のロックがあるかどうかを確認します。他の場所でそのテーブルで大きな選択を行う場合は、nolock を使用していることを確認してください。

于 2012-12-13T20:05:47.510 に答える