2016-08-07 14 views
2

私は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つの接続が必要です。最初は可能ですが、そうは考えにくいですが、2番目はPHPでは(デフォルトでは)不可能です。 – zerkms

+0

結局、並行性は問題ではないようです。私は矛盾した結果を引き起こしていた時間依存のエラーを発見しました。ロギングについてのコメントを回答として追加したいのであれば、あなたのアドバイスに従った直後にバグを発見したので、答えとしてマークします。 – Henry

+1

問題の説明付きで回答を投稿することをお勧めします – zerkms

答えて

2

ロガーを有効にするためのzerkmsのアドバイスを受けて、私はすぐに自分のコードの問題を追跡しました。並行性の問題はありませんでした。

tail -f /tmp/query.log 
:私は、ファイルを尾行

brew services restart apache2 

次へ:

編集:

その後
general_log_file = /tmp/query.log 
general_log  = 1 

/usr/local/etc/my.cnf は、これらの行を追加します。私のMac上で

は、私は次のことをやりました

2つのクエリ(挿入と選択)が正しい順序で実行されているのを見ました。これらのクエリをMySQLクライアントで直接実行すると、自分のコードにエラーが表示されます。

注:ログを/tmp/に入れると、ログアウトするたびにログが確実に削除されます。