15 分ごとに実行される Cron ジョブを設定しています。特定のテーブルに新しいデータがある場合は、そのテーブルをバックアップし、電子メールで送信して削除します。
バックアップの実行と同時にデータがデータベースに書き込まれ、データの「半分」がバックアップされ、残りのデータが削除されることを心配する必要はありますか?
ジョブが説明どおりに動作する場合SELECT
、メールの生成に使用された後、DELETE
.
これを防ぐ最も簡単な方法は、使用しているデータベース エンジンがトランザクションをサポートしていると仮定して、トランザクション内で 2 つのステートメントを実行することです。
DELETE
あるいは、一部のデータベース エンジンは、単一のアトミック トランザクションでステートメントからRETURNING
データを返すことをサポートしています。
そのオプションが利用できない場合は、別の解決策DELETE
として、ソース テーブルで上限の日付/時刻または自動インクリメント ID 列を使用することをお勧めします。これを実装するには、ソース テーブルのスキーマ変更が必要になる場合があります。擬似コードは次のようになります。
SELECT <variable> = max(<identity>)
FROM source_table
SELECT <columns>
FROM source_table
WHERE <identity> <= <variable>
DELETE source_table
WHERE <identity> <= <variable>
source_table
最初のSELECT
と の間に追加されたデータDELETE
は、 に格納されているよりも高い ID 値を持つ<variable>
ため、削除されません。