0

问题

我有一个执行以下操作的网页(代码已大大简化,仅显示相关代码。

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 扩展已经过时,但我还没有重写应用程序。

4

2 回答 2

1

到目前为止,MyISAM 是否不安全

mysql_insert_id保证只返回正确的值。

还是我忽略了另一种解释?

最有可能的。检查你的代码。

于 2013-09-13T13:04:04.627 回答
0

还没有听说过 MyISAM 中的身份问题。您可以尝试在调用 last_insert_id 时设置链接标识符,例如

$link = mysql_connect(...);    
mysql_query("insert into table1 (field1) values ('value')",$link);
$last_id = mysql_insert_id($link);
$result = mysql_query("select * from table1 t inner join ... where id = $last_id",$link);
write_a_file_using_result($result);
于 2013-09-13T13:07:40.987 回答