行を PHP に挿入した直後に行を選択しようとすると、断続的に問題が発生します。この問題は、100 ~ 1000 回の発生ごとに 1 回だけ発生します。これはphp 4.4を使用しており、アップグレード/ PDOまたはmysqliを使用できるオプションはありません。私はトランザクションの使用を検討していましたが、両方のクエリが実行され、トランザクションでも引き続き実行されますが、2 番目のクエリが実行されて空の RS が返されるため、トランザクションがそれを孵化させるとは思えません。
例として、自動インクリメント カウンターと格納された値の 2 つの列を持つテーブルを取り上げます。値も一意である必要がありますが、結合は値ではなくカウンターで行われます。一度に複数のユーザーが値を入力できるため、挿入したばかりの値が最も高いカウンターから得られると単純に信頼することはできません。
data:
data_id int(11) UNIQUE AUTO_INCREMENT NOT NULL
myData varchar(50) UNIQUE NOT NULL
これで、各ユーザーはいつでも新しい $val を入力できるようになりました。入力時には、ステータス テーブルにもエントリを作成する必要があります。
statuses:
status_id int(11) UNIQUE AUTO_INCREMENT NOT NULL
data_id int(11) NOT NULL
status int(1) NOT NULL
これを達成するために使用しているコードは次のとおりです。
// Get value
$insData = $_GET['VAL'];
// Insert value
$ins = mysql_query( "INSERT INTO data (myData) VALUES ('" . $insData . "')" )
or die(mysql_error());
// Get value's id
$res = mysql_query( "SELECT data_id FROM data WHERE myData='" . $insData . "'" )
or die(mysql_error());
// From here I would insert into the statuses table,
// but the new entry into the data table is sometimes not found!
コードが実行される 100 ~ 1000 回ごとに 1 回、select が実行され、行が返されません。データの挿入は正しく実行されます。これが可能だとは思いませんでした。なぜなら、挿入またはダイによって PHP が戻り値を待つようになり、行の「またはダイ」部分を実行するかどうかを知ることができるからです。実行が完了する前に PHP が挿入コマンドから戻り値を受け取った可能性はありますか? そして、この断続的な問題を今後どのように防ぐことができるでしょうか?