私のソフトウェアは、単一のデータベースに対して複数のマシンで実行されます。
ソフトウェア内で毎日実行されるタスクを希望します。正午。
このタスクが次のようになっていることを確認するにはどうすればよいですか。
- 1日1回だけ行われ、
- その日にどのマシン/ユーザーがたまたまソフトウェアを実行していても実行されます。
- ソフトウェアの他のインスタンスと同時に実行されませんか?
私のソフトウェアは、単一のデータベースに対して複数のマシンで実行されます。
ソフトウェア内で毎日実行されるタスクを希望します。正午。
このタスクが次のようになっていることを確認するにはどうすればよいですか。
クライアントでこれを行う場合の問題は、ユーザーが1日中ソフトウェアを実行しなかったり、操作中にハードウェア障害(電力損失など)が発生したりして、行が永続的にロックされる可能性があることです。タスクの整合性を保証することはできません。また、タスクが実行されることを保証することもできません。
ユーザーが実際にソフトウェアを毎日使用しているかどうかに関係なく実行されるようにする必要がある場合、これはデータベースサーバーでスケジュールされたタスク( WindowsおよびLinux / UNIXで使用可能)に役立ちます。
タスクを実行する実行可能ファイルを作成してから、スケジュールされたタスクを作成して毎日実行します。このようにして、データベースマシンが稼働している限り、常に実行される1つのインスタンスが得られ、クライアント間でのジョブの実行の追跡について心配する必要はありません。
さて、あなたは今、企業の規則のためにデータベースボックスでスケジュールされたタスクを実行できないと言っています。これが私が使用するスキームです:
重要な部分は「ジョブ開始時間」フィールドです。これにより、クライアントはジョブがかなり前(3時間など)に開始されたが完了していないかどうかを確認できるため、進行状況の値に応じて、ジョブを再試行したり、ユーザーにアラートを送信したりできます。 。
データベース内の単一行のテーブルを使用できます。トランザクションを使用して、最終更新日を含む行をロックします。
X分ごと:
SQLServerの使用例
これをトランザクションで実行すると、他のクライアントからの行がロックされます
UPDATE Test WITH (ROWLOCK)
SET UpdateDate = yourDate
WHERE PrimaryKey = yourkey