私はSymfony 2/Doctrine 2アプリケーションの単体テストを書いていますが、並行性の問題のように見えます。Doctrine 2並行性の問題
$obj = new Obj();
$obj->setName('test');
... etc ...
$em->persist($obj);
$em->flush();
...
$qb = $em->getRepository('Obj');
// Select object using DQL
$this->assertTrue($obj !== null);
この時点での$ objが、多くの場合、nullの場合:
のコードは次のようになります。私。 DQLクエリはそれを見つけることができませんでした。 DQLを実行する前にブレークポイントを追加して実行を一時停止すると、$ objが常に検出されます。そうでない場合、通常は見つからないが、時にはそれが見つかる。
私は、トランザクションに挿入をラップ試してみました:
$em->getConnection()->beginTransaction();
$obj = new Obj();
$obj->setName('test');
... etc ...
$em->persist($obj);
$em->flush();
$em->getConnection()->commit();
これは助けていないようです。
IインサートとDQLクエリとの間のポーズを追加しようとしている:
sleep(1);
これは一貫して正常な動作になります。したがって、これは並行性の問題であるとの私の結論。あるいは少なくとも教授法と並行してすぐに書くことではないものがあります。
Doctrine 2にデータベースへの書き込みを強制する方法はありますか?または聞くイベントですか?あるいは私はここで何か他のことをやっていますか?
データベースサーバーのクエリログを有効にし、クエリの発行方法を確認します。並行性の問題であることを観察するためには、同時に実行する2つの接続が必要です。最初は可能ですが、そうは考えにくいですが、2番目はPHPでは(デフォルトでは)不可能です。 – zerkms
結局、並行性は問題ではないようです。私は矛盾した結果を引き起こしていた時間依存のエラーを発見しました。ロギングについてのコメントを回答として追加したいのであれば、あなたのアドバイスに従った直後にバグを発見したので、答えとしてマークします。 – Henry
問題の説明付きで回答を投稿することをお勧めします – zerkms