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>ため、削除されません。