0

問題

次のことを行う Web ページがあります (コードは、関連するコードのみを表示するために大幅に簡略化されています。

mysql_query("insert into table1 (field1) values ('value')");
$last_id = mysql_insert_id();
$result = mysql_query("select * from table1 t inner join ... where id = $last_id");
write_a_file_using_result($result);

表の行で見つけたものとは異なるデータセットを使用してファイルが作成されたことが起こりました。

私が持っている唯一の説明は次のとおりです。

  • call1: ページが呼び出された 1. データセット 1 の時間。
  • call1: データセット 1 は接続 1 に挿入されますが、テーブルにはコミットされません。
  • call2: ページが呼び出されました 2. データセット 2 の時間
  • call2: データセット 2 が接続 2 に挿入され、同じ値mysql_insert_idを返します
  • call1: ファイルは日付セット 1 で生成されます
  • call2: ファイルは既に存在するため、書き込めません

結果: ファイルはデータセット 1 で生成され、表の行にはデータ行 2 が含まれます。

設定

mysql 5.0.51b

テーブル:

CREATE TABLE `table1` (
  `id` int(11) NOT NULL auto_increment,
  (...)

質問

MyISAM がトランザクションをサポートしていないことは知っています。しかし、行を上書きできるように、2 つの行を挿入して同じ ID を 2 回挿入することは不可能だと本当に期待しています。

MyISAM はこの時点で安全ではありませんか、それとも私が見落としている別の説明がありますか?

ノート

PHP の mysql 拡張機能が古くなっていることは知っていますが、まだアプリケーションを書き直していません。

4

2 に答える 2

1

MyISAM はこの時点で安全ではありませんか

いいえmysql_insert_id。正しい値のみを返すことが保証されています。

または私が見落としている別の説明がありますか?

最も可能性が高い。コードを確認してください。

于 2013-09-13T13:04:04.627 に答える