0

行を 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 が挿入コマンドから戻り値を受け取った可能性はありますか? そして、この断続的な問題を今後どのように防ぐことができるでしょうか?

4

2 に答える 2

0

INSERT しようとしているデータ (予想されるエラー メッセージが表示されない場合) は、たまたま重複レコード (つまり、既に TABLE DATA にあるレコードと一致する) ですか?

もしそうなら、参照してください

具体的には、mysqlgatchas からの引用:

「...さらなる特異性は、次の動作のようです。

CREATE TABLE insert_test2 (
id INT NOT NULL PRIMARY KEY,
txt VARCHAR(32)
);
INSERT INTO insert_test2 VALUES(1, 'foo');
INSERT INTO insert_test2 VALUES(2, 'bar');

これを見てください:

mysql> INSERT INTO insert_test2 VALUES(1, 'bar');
ERROR 1062: Duplicate entry '1' for key 1

正しい動作...これを見てください:

mysql> INSERT INTO insert_test2 (id, txt) SELECT i.id, i.txt FROM insert_test i 
WHERE i.id=1;
Query OK, 0 rows affected (0.00 sec)
Records: 1  Duplicates: 1  Warnings: 0

mysql> SELECT * FROM insert_test2;
+----+------+
| id | txt  |
+----+------+
|  1 | foo  |
|  2 | bar  |
+----+------+
2 rows in set (0.00 sec)

このステートメントは、上記と同じエラーで失敗することが予想されます。代わりに、ステートメントが事実上無視されたことを示す Duplicates: 1 通知のみで、ステートメントは成功したように見えます。

更新: バージョン 4.0.20、および場合によってはそれ以前のバージョンでは、このステートメントは予想されるエラー メッセージを返します..."

于 2013-09-06T16:15:31.263 に答える