MySQL仅在MySQL 5.1上插入MyISAM上的竞争条件,而不是5.5或5.6或InnoDB

时间:2014-07-09 15:44:47

标签: php mysql centos myisam

我使用的是MySQL 5.1,PHP 5.3,表格是MyISAM。这是这个假表的DTD:

CREATE TABLE `temp1` (
  `value` varchar(10) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1

此脚本基本上打印表temp1的行计数,然后插入一行,然后再次打印行计数,然后休眠一秒钟并再次打印行计数。 INSERT由write用户完成,SELECT由read用户完成。

<?php

$value = "test";
$ro_user = "ro";
$ro_pass = "ro";
$write_user = "write";
$write_pass = "write";
$db_name = "db";

$ro_db = mysql_connect('localhost', $ro_user, $ro_pass);
mysql_select_db($db_name, $ro_db);

$res = mysql_query("SELECT * FROM temp1 WHERE value = '" . mysql_real_escape_string($value) . "'", $ro_db);
var_dump(mysql_num_rows($res));

$write_db = mysql_connect('localhost', $write_user, $write_pass);
mysql_select_db($db_name, $write_db);
mysql_query("INSERT INTO temp1 (`value`)  VALUES ('" . mysql_real_escape_string($value) . "')", $write_db);

$res = mysql_query("SELECT * FROM temp1 WHERE value = '" . mysql_real_escape_string($value) . "'", $ro_db);
var_dump($res);
var_dump(mysql_num_rows($res));

sleep(1);

$res = mysql_query("SELECT * FROM temp1 WHERE value = '" . mysql_real_escape_string($value) . "'", $ro_db);
var_dump($res);
var_dump(mysql_num_rows($res));

打印输出通常是这样的:

int(12)
resource(8) of type (mysql result)
int(12)
resource(9) of type (mysql result)
int(13)

这似乎表明在执行第二个INSERT查询时SELECT尚未完全完成。所以我的问题是:

  • MySQL INSERT语句通常是异步的吗?很难获得有关这方面的信息,但我认为答案是否定的。
  • 是否存在会影响此行为的MySQL设置?
  • 这里的桌面引擎是否重要?
  • 是否存在缓存的可能性?我在默认设置的流浪盒上运行它。

即使更奇怪,我无法在MySQL 5.5或5.6或任何InnoDB表中重现此行为。没有竞争条件出现在那里。

0 个答案:

没有答案