2

我有一些代码可以创建一个用户,然后它会检查用户是否真实。本质上是这样的:

// 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 日志记录,发现在SELECT之前调用了健全性,INSERT但是SELECT显然从数据库中选择了正确的 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 日志在所有情况下都按照我的预期显示查询,没有DEFER

编辑 2 使用命令行而不是 Jenkins 并行运行测试仍在使这种情况发生。同时它最多只能同时运行 7 个测试,并且代码中没有任何地方会在当时删除用户。除了在所有测试运行之前,没有一揽子删除。

编辑 3 好的,所以在运行的测试中,有一些持久连接。一种用于 MySQL,一种用于 Mongo。在我的套件运行之前,它通过从头开始重建数据库并擦除内存缓存来擦除 MySQL。它没有为 mongo 执行此操作,因此导致了一些其他随机错误。一旦我将 mongo 添加到重置脚本中,MySQL 错误似乎就消失了。这对我团队中的任何人或我自己来说都是零意义的。任何人都可以理解吗?

4

1 回答 1

-1

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

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

于 2013-08-02T03:43:05.630 回答