ユーザーを作成し、後でユーザーが本物かどうかをチェックするコードがいくつかあります。基本的にこれ:
// 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
呼び出される前に、DB から適切な ID が明確に選択されていることがわかりました。これは、作成が機能しない限り取得できませんでした。INSERT
SELECT
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 ログには、すべての場合に期待どおりのクエリが表示され、NO が表示されますDEFER
EDIT 2 Jenkinsではなくコマンドラインを使用してテストを並行して実行すると、まだこれが発生します。その間、同時に最大 7 つのテストしか実行できず、同時にユーザーを削除するコードのどこにもありません。すべてのテストが実行される前を除いて、一括削除はありません。
EDIT 3 さて、実行されるテストでは、いくつかの永続的な接続があります。1 つは MySQL 用で、もう 1 つは Mongo 用です。私のスイートが実行される前は、DB をゼロから再構築して MySQL を消去し、memcache を消去していました。mongo に対してこれを行っていなかったため、他のランダム エラーが発生していました。mongo をリセット スクリプトに追加すると、MySQL エラーが解消されたようです。これは、私のチームや私自身の誰にとっても意味がありません。誰でもそれを理解できますか?