0

だから、少し問題があります。 このレガシーアプリケーションでWebサービスを公開し、モバイルアプリケーションから送信されたデータを受け取るケースがあります。長時間実行されているトランザクションのためにアプリケーションがエラーをスローする方法についての提案

最近、モバイルアプリからデータを渡すプロセスが結果を送信するのに非常に長い時間がかかります。

ウェブサービスログを調べると、コード内のさまざまなメソッドを指摘していますが、多くの例外があります。これらのメソッドの共通点は、データベースへの書き込み操作であることです。すべてのメソッドは、アプリケーションによって開かれるより大きなSQLトランザクションの一部です。

アプリケーションは、データベースへの書き込みを開始する前に、結果の処理中に多くのチェックと参照を行います。すべてがEntity Frameworkを介して行われ、トランザクション内でラップされます。

これらのトランザクションはデータベースをロックし、他の受信結果が処理されないようにして、アプリケーションからの結果をタイムアウトに渡し、最終的にゲートを通過するまで再試行しようとします。それだけで私たちの理論です。

トランザクションは新しいデータをデータベースに書き込むだけです。既存のデータは変更されません。トランザクションでそれをラップする唯一の理由は、トランザクションが失敗した場合にトランザクションをロールバックできることです。それが動作している間に他の書き込み操作を避けることはできません。

主な問題は、これは従来のアプリケーションであり、現在はアプリケーションを開発した人にはアクセスできません。したがって、書き換えを行うと非常に時間がかかり、エラーが発生しやすくなります。私たちは、この特定の質問を段階的に廃止する過程にあります。だから、私たちだけが時間を買うことができれば理想的です。

2つの並列書き込み操作を実行することに問題はないはずですが、アプリケーションの大幅な書き換えを行うことなく、複数のトランザクションを同時に実行できる簡単な方法はありますか?

+0

トランザクションを開いてそのトランザクション内のすべてを実行しないでください。実際の挿入/更新/削除はトランザクション内でのみ行う必要があります。トランザクションを長時間開いたままにしておき、問題の原因となっている読書トランザクションを大幅に変更する可能性があります。 – GuidoG

+0

こんにちは@GuidoG、我々はそれを実現しました。問題は、他の読み取り操作をブロックしているとは思われません。トランザクションが他の書き込み操作(それ自体の他のインスタンス)をブロックしていることです。しかし、質問に記されているように、理論的にはそれらの複数を同時に実行させることに問題はないはずです。 どうにか成就できますか? –

+0

読み取り操作をブロックしておらず、書き込み操作のみをブロックしていることを確認してください。あなたがそれを呼び出すと、他のインスタンスはそれ自体ですか?それをどうやって知っているのですか?また、他のアプリケーションでこのデータベースの読み取り/更新を行っていますか?彼らもブロックしている可能性があります。 – GuidoG

答えて

0

まず、生成されているロックのハンドルを取得することをお勧めします。 sys.dm_tran_locksなどをつかみ始めます。

あなたのDBにはFKやインデックスなどがたくさんありますか?アプリケーションを信頼できる場合は、これらを無効にすることを検討できます。

また、アーカイブするのが一番簡単かもしれません。ライブテーブルから履歴データを削除できますか?これらが小さいほど良い。

最悪の場合 - 複数のDB(アプリプールごとに1つなど)を作成し、手動でデータをマスターにマージすることができます。

+0

あなたのコメントのおかげでジョン。あなたの質問にお答えします: はい、かなりのFKがあります。我々はこれらを無効にするのに十分なほどのアプリを信頼していない。 データはレポートに使用されていますが、残念ながら私たちはデータセット全体で使用しているため、実際には何もアーカイブすることはできません。 これは解決策かもしれませんが、これまでのところでは結果を取り込んで処理する手続きの書き換えが簡単になると思います。 前述のとおり、アプリケーションを段階的に廃止し、数ヶ月以上実行するだけです。私たちは並列トランザクションを可能にするより現実的な解決策を見つけることを望んでいる –

+0

FKを決して無効にすることはありません。あなたのデータベースが壊れていないことを確かめることができるのはこの世界の唯一のものです。 – GuidoG

0

問題は、クライアントがdbをどのように使用しているかです。クライアントがテーブルをロックして他のものがアクセスできないようにすることができます。通常

私は「と(NOLOCK)」のヒントのようなものを使用することをお勧めし、私が代わりにこれを見てお勧めしますが、あなたの使用してEntity Frameworkのため、(あなたのアプリケーションが汚れて読み扱うことができるかどうかによって異なります):Get Entity Framework 6 use NOLOCK in its underneath SELECT statements

データベースの分離レベルは大きな役割を果たします。 Isolation Levels

クライアントがdbとやり取りする方法を確認することをお勧めします。長い時間がかかる操作は、選択、挿入、更新、アップアップですか?あなたはそれをプロファイルし、問題が何かを見ましたか? (計画の説明など)

テーブルにインデックスがありますか?クエリはインデックスを使用していますか?

問題が挿入/更新(アップサート)問題の場合、Entity Frameworkはそれを非常に処理します。このコードをこのようなものに変更することをお勧めします。Upsert fast in SQL Server

エンティティフレームワークは大規模なデータセットを扱う際には便利ですが、パフォーマンスが良くありません。

関連する問題