由于并发,MyISAM数据库中的数据不正确

时间:2013-09-13 12:41:52

标签: php mysql concurrency atomic myisam

问题

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

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

2 个答案:

答案 0 :(得分:1)

  

MyISAM到目前为止是不安全的

没有。 mysql_insert_id保证仅返回正确的值。

  

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

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

答案 1 :(得分:0)

没有在MyISAM中听说过id问题。 您可以在调用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);