Php MySQL查询怎么会以错误的顺序出现?

Php MySQL查询怎么会以错误的顺序出现?,php,mysqli,jenkins,phpunit,Php,Mysqli,Jenkins,Phpunit,我有一些代码可以创建一个用户,稍后它会检查用户是否真实。基本上是: // INSERT statement fired in here $user = self::_createUser( $params ); // Performs a sanity check by hitting DB with // SELECT for the ID returned from creation within object if ( !$user->isReal() ) { throw ne

我有一些代码可以创建一个用户,稍后它会检查用户是否真实。基本上是:

// INSERT statement fired in here
$user = self::_createUser( $params );

// Performs a sanity check by hitting DB with
// SELECT for the ID returned from creation within object
if ( !$user->isReal() ) {
  throw new Exception( "User failed to create: " . var_export( $params, 1 ), MYCODE );
}
由于用户刚刚创建,因此不应引发此异常。这在生产环境或我的沙箱环境中从未发生过。然而,我们的测试环境使用Jenkins一次启动多个测试,上面的代码行就在这里

异常将在套件每次运行的不同测试中随机抛出

我们打开了所有MySQL日志记录,发现在插入之前调用了sanityselect,但是SELECT显然是从DB中选择了正确的ID,除非创建工作正常,否则它无法获得正确的ID

MySQL服务器如何以错误的顺序随机接收查询?以前从没见过这样的事

编辑这里是更多的代码澄清

function _createUser( $params ) {
  // db returns connection using Zend, which translates to something like
  // INSERT INTO users SET name='a'
  // Returns ID of row inserted
  $this->_id = self::db()->insert( 'users', $params );
}

function isReal() {
  // Returns false when row is not there
  return self::db()->fetchRow( "SELECT * FROM users WHERE id={$this->_id}" );
}
此外,MySQL日志在所有情况下都显示了我期望的查询,没有延迟

编辑2 使用命令行而不是Jenkins来运行并行测试仍然使这一点得以实现。 同时,它最多只能同时运行7个测试,并且在代码中没有任何地方会同时删除用户。除非在所有测试运行之前,否则不会进行全面删除

编辑3
好的,在运行的测试中,有一些持久连接。一个是MySQL,一个是Mongo。在我的套件运行之前,它通过从头开始重建DB来擦除MySQL,并擦除memcache。它不是为mongo这样做的,因此导致了其他一些随机错误。一旦我将mongo添加到重置脚本中,MySQL错误似乎就消失了。这对我的团队中的任何人或我自己来说都毫无意义。有人能理解吗?

我不知道为什么,但两天后,这个错误消失了。就像我第三次编辑说的那样。。。在我确定清空MySQL和memcache时,我也清空了mongo。我最好的猜测是,当坏的mongo数据导致异常时,PHP会以某种方式发出劈啪声。我不确定这是不是一个PHP错误,或者如果我试图报告它,听起来会很疯狂


虽然我发布了这个答案,但我仍然非常感谢任何额外的输入。

我不知道为什么,但两天后,这个错误消失了。就像我第三次编辑说的那样。。。在我确定清空MySQL和memcache时,我也清空了mongo。我最好的猜测是,当坏的mongo数据导致异常时,PHP会以某种方式发出劈啪声。我不确定这是不是一个PHP错误,或者如果我试图报告它,听起来会很疯狂


尽管我发布了这个答案,但我仍然希望您能提供更多的信息。

也许您有多次跑步会相互干扰?作为旁注:您应该认真研究模拟数据库,没有理由在测试中实际调用MySQL。PHPUnit对模拟有很好的支持。@FritsvanCampen即使我的并行测试同时进行,每个测试都是一个线程。测试是如何连续创建和检查的,但是MySQL会以相反的顺序获取它?我不知道,它不应该这样做。这没有道理。你看到的可能是别的东西。也许日志记录器真的关闭了?@FritsvanCampen这是一个真正的MySQL日志,在查询进入时触发,它不是我编写的任何代码的一部分。你的插入是否有延迟?也许你有多次运行相互干扰?作为旁注:您应该认真研究模拟数据库,没有理由在测试中实际调用MySQL。PHPUnit对模拟有很好的支持。@FritsvanCampen即使我的并行测试同时进行,每个测试都是一个线程。测试是如何连续创建和检查的,但是MySQL会以相反的顺序获取它?我不知道,它不应该这样做。这没有道理。你看到的可能是别的东西。也许记录器真的关闭了?@FritsvanCampen这是一个真正的MySQL日志,查询一进来就触发了它,它不是我编写的任何代码的一部分。你的插入是否有延迟?