Symfony实体已被另一个进程更改并持久化。我的长期运行过程不会';我没发现

Symfony实体已被另一个进程更改并持久化。我的长期运行过程不会';我没发现,symfony,caching,doctrine,multiprocessing,Symfony,Caching,Doctrine,Multiprocessing,我有一个长期运行的symfony进程,它使用 $msg = $this->entityManager->getRepository('App\Entity\Message')->findOneBy([ 'id' => $id ]); 我收到了消息,一切都很好。两分钟后,相同的消息被另一个Symfony进程更改并持久化。现在5分钟后,我再次查询相同的消息Id: $msg = $this->entityManager->getRepo

我有一个长期运行的symfony进程,它使用

 $msg = $this->entityManager->getRepository('App\Entity\Message')->findOneBy([
        'id' => $id
    ]);
我收到了消息,一切都很好。两分钟后,相同的消息被另一个Symfony进程更改并持久化。现在5分钟后,我再次查询相同的消息Id:

 $msg = $this->entityManager->getRepository('App\Entity\Message')->findOneBy([
        'id' => $id
    ]);
不幸的是 我再次得到原始消息,可能是因为它被缓存了,即Symfony/doctor没有检测到其他进程修改了数据库

我当然可以

$this->entityManager->refresh($msg);
,但这将在数据库上造成大量不必要的负载。


是否有更好的方法,例如为缓存设置常规timeToLive?或者更好:让Symfony在缓存变“脏”时进行检测?

这几乎就是Doctrine工作单元的设计方式。加载实体时,它将保持加载状态,对它的任何后续请求都将返回内存中的版本。通常,在请求/响应环境中,每个请求都会重新启动工作单元。对于一个长时间运行的流程来说,没有那么多。如果不询问数据库,条令真的无法知道数据库发生了变化。你似乎想避免的事情。如果性能确实受到影响,那么您可以添加变通代码。这几乎就是Doctrine工作单元的设计方式。加载实体时,它将保持加载状态,对它的任何后续请求都将返回内存中的版本。通常,在请求/响应环境中,每个请求都会重新启动工作单元。对于一个长时间运行的流程来说,没有那么多。如果不询问数据库,条令真的无法知道数据库发生了变化。你似乎想避免的事情。如果性能确实受到影响,那么您可以添加变通代码。