问题
我有一个执行以下操作的网页(代码已大大简化,仅显示相关代码。
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 不支持事务。但是我真的希望插入两行并插入两次相同的id是不可能的,因此可以覆盖该行。
到目前为止,MyISAM 是不安全的还是我忽略了另一种解释?
笔记
我知道 php 的 mysql 扩展已经过时,但我还没有重写应用程序。