ファイルを処理し、ファイルに関する情報をデータベースに挿入する PHP スクリプトに取り組んでいます。
具体的には、スクリプトは何らかの情報を処理し、トランザクションを開始してテーブルに挿入します。次に、挿入したばかりの行lastinsertid
を取得し、それを関連ファイルの処理に使用します。処理が完了したら (2 ~ 30 秒かかります)、他のテーブルにさらに数回挿入し、ファイル処理が成功したことを確認してからトランザクションを完了します。ID
ID
したがって、基本的に要約は次のとおりです。
START TRANSACTION
INSERT DATA INTO TABLE 1
PROCESS FILE USING INSERT ID (takes 2-30 seconds)
INSERT DATA INTO TABLE 2
INSERT DATA INTO TABLE 3
INSERT DATA INTO TABLE 4
//VERIFY FILE PROCESSING
if ($file_process == true){
COMMIT
}
else{
ROLLBACK
}
ロックを長時間保持することに関する問題があるため、長いトランザクションを避ける必要があることはわかっていますが、トランザクションが挿入のみを使用する場合はどうでしょうか。挿入は挿入されている行のみをロックするため、これはまだ問題ですか?
この状況から生じる可能性のある潜在的な「落とし穴」について誰か説明してもらえますか? あるセッションのプロセスに時間がかかり、別のセッションが独自のプロセスを開始した場合、プロセスは挿入のみを処理するため、session 1
ブロックされないことは確かです。session 2
また、session 1
失敗してロールバックする必要がある場合は、何の影響session 2
もありません (データベース以外では、自動インクリメント プライマリ ID にギャップがありますが、それは問題ではありません)。