私は現在、複数のインスタンスが同時に実行されるac#コンソールアプリを持っています。アプリはデータベース内の値にアクセスして処理します。行が処理されている間、他のインスタンスが同時に処理しようとしないようにフラグが立てられます。私の質問は、プログラムのインスタンスがクラッシュした場合にこれらの値のフラグを解除するための効率的で優雅な方法は何ですか?したがって、インスタンスがクラッシュした場合は、プログラムのそのインスタンスによって現在処理されている値のフラグを解除するだけです。
ありがとう
私は現在、複数のインスタンスが同時に実行されるac#コンソールアプリを持っています。アプリはデータベース内の値にアクセスして処理します。行が処理されている間、他のインスタンスが同時に処理しようとしないようにフラグが立てられます。私の質問は、プログラムのインスタンスがクラッシュした場合にこれらの値のフラグを解除するための効率的で優雅な方法は何ですか?したがって、インスタンスがクラッシュした場合は、プログラムのそのインスタンスによって現在処理されている値のフラグを解除するだけです。
ありがとう
考えられる解決策は、コンソール アプリケーションの起動方法に大きく依存します。
この場合、アプリケーションはデータベース内の構成レコードに基づいて開始されます。これらのアプリケーションのいずれかがロックを実行する場合、データベース構成レコードの主キーを使用してロックを実行します。
アプリケーションが起動すると、最初に、以前にロックしたレコードのすべてのロックを解放します。
すべての子プロセスを制御するために、構成テーブルからの情報を使用してプロセスを開始し、それらを監視して、失敗したときに再起動するサービスがあります。
また、各プロセスは、データベース内のステータス テーブルを更新し、最後に使用可能になった時刻を更新します。最大許容遅延は 2 分です (負荷の高い処理の場合)。このステータス テーブルは、システム管理者が問題を監視するために使用されますが、特定のプロセスで繰り返し障害が発生した場合に手動でロックを解放するためにも使用できます。
このような構造化されたアプローチがない場合、アプリケーション パフォーマンスの確固たるプロファイルがなく、5 分以上経過したロックが無効であることを認識できない限り、レコードを自動的にロック解除することは非常に困難です。最大 2 分のレコードを処理するのに、平均で 15 秒かかります。
あらゆる種類のクラッシュを処理できるようにするために、電源を切ってもレコードにタイムスタンプを追加し、妥当なタイムアウトが発生した後、フラグが立てられていてもレコードをロック解除されたものとして扱うことをお勧めします。