だから、少し問題があります。 このレガシーアプリケーションでWebサービスを公開し、モバイルアプリケーションから送信されたデータを受け取るケースがあります。長時間実行されているトランザクションのためにアプリケーションがエラーをスローする方法についての提案
最近、モバイルアプリからデータを渡すプロセスが結果を送信するのに非常に長い時間がかかります。
ウェブサービスログを調べると、コード内のさまざまなメソッドを指摘していますが、多くの例外があります。これらのメソッドの共通点は、データベースへの書き込み操作であることです。すべてのメソッドは、アプリケーションによって開かれるより大きなSQLトランザクションの一部です。
アプリケーションは、データベースへの書き込みを開始する前に、結果の処理中に多くのチェックと参照を行います。すべてがEntity Frameworkを介して行われ、トランザクション内でラップされます。
これらのトランザクションはデータベースをロックし、他の受信結果が処理されないようにして、アプリケーションからの結果をタイムアウトに渡し、最終的にゲートを通過するまで再試行しようとします。それだけで私たちの理論です。
トランザクションは新しいデータをデータベースに書き込むだけです。既存のデータは変更されません。トランザクションでそれをラップする唯一の理由は、トランザクションが失敗した場合にトランザクションをロールバックできることです。それが動作している間に他の書き込み操作を避けることはできません。
主な問題は、これは従来のアプリケーションであり、現在はアプリケーションを開発した人にはアクセスできません。したがって、書き換えを行うと非常に時間がかかり、エラーが発生しやすくなります。私たちは、この特定の質問を段階的に廃止する過程にあります。だから、私たちだけが時間を買うことができれば理想的です。
2つの並列書き込み操作を実行することに問題はないはずですが、アプリケーションの大幅な書き換えを行うことなく、複数のトランザクションを同時に実行できる簡単な方法はありますか?
トランザクションを開いてそのトランザクション内のすべてを実行しないでください。実際の挿入/更新/削除はトランザクション内でのみ行う必要があります。トランザクションを長時間開いたままにしておき、問題の原因となっている読書トランザクションを大幅に変更する可能性があります。 – GuidoG
こんにちは@GuidoG、我々はそれを実現しました。問題は、他の読み取り操作をブロックしているとは思われません。トランザクションが他の書き込み操作(それ自体の他のインスタンス)をブロックしていることです。しかし、質問に記されているように、理論的にはそれらの複数を同時に実行させることに問題はないはずです。 どうにか成就できますか? –
読み取り操作をブロックしておらず、書き込み操作のみをブロックしていることを確認してください。あなたがそれを呼び出すと、他のインスタンスはそれ自体ですか?それをどうやって知っているのですか?また、他のアプリケーションでこのデータベースの読み取り/更新を行っていますか?彼らもブロックしている可能性があります。 – GuidoG