Doctrine 2并发问题

时间:2016-08-07 23:49:02

标签: php symfony concurrency doctrine-orm

我正在编写Symfony 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();

这似乎没有帮助。

我尝试在插入和DQL查询之间添加一个暂停:

sleep(1); 

这会导致预期的行为一致。因此我的结论是这是一个并发问题。或者至少与Doctrine有关的事情并没有立即写下来。

Doctrine 2是否有办法强制写入数据库?还是要听的事件?或者我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

按照zerkms的建议启用日志记录我很快就将问题跟踪到了我自己的代码中的错误。没有并发问题。

在我的Mac上,我做了以下事情:

修改:/usr/local/etc/my.cnf 添加以下行:

general_log_file = /tmp/query.log
general_log      = 1

然后:

brew services restart apache2

接下来我把文件丢了:

tail -f /tmp/query.log

我看到了两个查询 - 一个插入和一个选择 - 以正确的顺序执行。直接在MySQL客户端中运行这些查询会在我的代码中显示错误。

注意:将日志放入/tmp/可确保每次我注销时都会删除日志。