0

ファイルを処理し、ファイルに関する情報をデータベースに挿入する PHP スクリプトに取り組んでいます。

具体的には、スクリプトは何らかの情報を処理し、トランザクションを開始してテーブルに挿入します。次に、挿入したばかりの行lastinsertidを取得し、それを関連ファイルの処理に使用します。処理が完了したら (2 ~ 30 秒かかります)、他のテーブルにさらに数回挿入し、ファイル処理が成功したことを確認してからトランザクションを完了します。IDID

したがって、基本的に要約は次のとおりです。

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 にギャップがありますが、それは問題ではありません)。

4

3 に答える 3

0

そこでトランザクションを使用することに確信が持てない場合は、そこにnew_added_row追加の列を使用することをお勧めします。何か問題が発生した場合はnew_added_row=1、トランザクションをロールバックするために列を削除するだけです。そのinsert_idを引き続き取得し、トランザクションを使用せず、変更をロールバックできます。複数のユーザーがこれを非同期で行う場合は、「session_key 追加列」を使用して、他のユーザーの挿入が削除されないようにすることを検討してください。

于 2013-04-12T19:16:13.370 に答える
0

データベースの実行時間が 30 秒に達している場合、PHP スクリプトに挿入すると、PHP の最大実行時間の上限に達する可能性があります。

プログラムで時間制限を変更することで、これを軽減できます。

http://php.net/manual/en/function.set-time-limit.php

また

php.ini ファイルを変更して、デフォルトを変更できます。これが問題になる場合は、データベース呼び出しのみを変更して、データベースに関係のないランナウェイ スクリプトがサーバーのリソースを詰まらせないようにすることをお勧めします。

于 2013-04-12T19:15:46.803 に答える