在将行插入 PHP 后立即尝试选择行时,我间歇性地看到一个问题。此问题只会在每 100-1000 次发生中发生一次。这是使用 php 4.4,没有升级/能够使用 PDO 或 mysqli 的选项。我正在考虑使用事务,但是两个查询都会执行并且即使有事务也会继续这样做,但是第二个查询运行并返回空 RS,所以我怀疑事务会孵化它。
例如,以一个包含两列的表为例:一个自增计数器和一个存储值。该值也必须是唯一的,但连接是在计数器上进行的,而不是值。一次可以由多个用户输入值,所以我不能简单地相信最高的计数器会给我刚刚插入的值。
data:
data_id int(11) UNIQUE AUTO_INCREMENT NOT NULL
myData varchar(50) UNIQUE NOT NULL
现在每个用户都可以随时输入一个新的 $val,并且当他们输入它时,还必须在状态表中输入一个条目。
statuses:
status_id int(11) UNIQUE AUTO_INCREMENT NOT NULL
data_id int(11) NOT NULL
status int(1) NOT NULL
我用来完成此操作的代码是:
// Get value
$insData = $_GET['VAL'];
// Insert value
$ins = mysql_query( "INSERT INTO data (myData) VALUES ('" . $insData . "')" )
or die(mysql_error());
// Get value's id
$res = mysql_query( "SELECT data_id FROM data WHERE myData='" . $insData . "'" )
or die(mysql_error());
// From here I would insert into the statuses table,
// but the new entry into the data table is sometimes not found!
代码每运行 100-1000 次,选择就会执行并且不返回任何行。数据插入将正确执行。我不相信这是可能的,因为 insert 或 die 迫使 PHP 等待返回值,以便它知道是否执行该行的“or die”部分。PHP是否有可能在执行完成之前从插入命令收到返回值,因此紧跟在插入之后的选择语句无法返回任何行?将来如何防止这种间歇性问题?