問題
次のことを行う 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 拡張機能が古くなっていることは知っていますが、まだアプリケーションを書き直していません。