-1

私のソフトウェアは、単一のデータベースに対して複数のマシンで実行されます。

ソフトウェア内で毎日実行されるタスクを希望します。正午。

このタスクが次のようになっていることを確認するにはどうすればよいですか。

  • 1日1回だけ行われ、
  • その日にどのマシン/ユーザーがたまたまソフトウェアを実行していても実行されます。
  • ソフトウェアの他のインスタンスと同時に実行されませんか?
4

2 に答える 2

2

クライアントでこれを行う場合の問題は、ユーザーが1日中ソフトウェアを実行しなかったり、操作中にハードウェア障害(電力損失など)が発生したりして、行が永続的にロックされる可能性があることです。タスクの整合性を保証することはできません。また、タスクが実行されることを保証することもできません。

ユーザーが実際にソフトウェアを毎日使用しているかどうかに関係なく実行されるようにする必要がある場合、これはデータベースサーバーでスケジュールされたタスク( WindowsおよびLinux / UNIXで使用可能)に役立ちます。

タスクを実行する実行可能ファイルを作成してから、スケジュールされたタスクを作成して毎日実行します。このようにして、データベースマシンが稼働している限り、常に実行される1つのインスタンスが得られ、クライアント間でのジョブの実行の追跡について心配する必要はありません。


さて、あなたは今、企業の規則のためにデータベースボックスでスケジュールされたタスクを実行できないと言っています。これが私が使用するスキームです:

  1. ジョブスケジューリング用のテーブルを作成します。各ジョブに、実行する日付/時刻、ジョブが開始された時刻(開始されていない場合はnull)、進行状況フィールド、およびタスクに必要な名前とその他の情報を入力します。
  2. 各クライアントに5分程度ごとにポーリングさせて、クエリを実行し、過去の日付を持つジョブを見つけます。行がロックされていない最初のジョブを選択します。
  3. 行をロックし、「timejobstarted」フィールドを現在の時刻に更新します。
  4. タスクを実行し、ジョブの一部として進行状況フィールドを更新します。
  5. 成功した場合は行を削除します。それ以外の場合は、行に「失敗」のフラグを付けます。

重要な部分は「ジョブ開始時間」フィールドです。これにより、クライアントはジョブがかなり前(3時間など)に開始されたが完了していないかどうかを確認できるため、進行状況の値に応じて、ジョブを再試行したり、ユーザーにアラートを送信したりできます。 。

于 2012-07-25T08:20:47.283 に答える
1

データベース内の単一行のテーブルを使用できます。トランザクションを使用して、最終更新日を含む行をロックします。

X分ごと:

  • レコードがロックされている場合は、誰かがジョブを実行していることを意味します。何もしない。
  • レコードが古くてロックが解除されている場合は、レコードをロックして作業を実行します。失敗した場合は、レコードのロックを解除します。成功した場合は、現在の日付でレコードを更新します。
  • レコードに現在の日付が含まれている場合は、何もしません。

SQLServerの使用例

これをトランザクションで実行すると、他のクライアントからの行がロックされます

UPDATE Test WITH (ROWLOCK)
SET UpdateDate = yourDate
WHERE PrimaryKey = yourkey
于 2012-07-25T08:21:41.307 に答える