Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
应如何在symfony2中跨不同服务共享的doctrine EntityManager实例中处理刷新?_Doctrine_Symfony - Fatal编程技术网

应如何在symfony2中跨不同服务共享的doctrine EntityManager实例中处理刷新?

应如何在symfony2中跨不同服务共享的doctrine EntityManager实例中处理刷新?,doctrine,symfony,Doctrine,Symfony,我在symfony 2中定义了几个服务,这些服务将更改持久化到数据库中。 这些服务将条令实例作为其依赖项之一: a.given.service: class: Acme\TestBundle\Service\AGivenService arguments: [@doctrine] 如果我有两个不同的服务,并且它们都通过EntityManager持久化对象,这是从doctrine实例获得的: $em = $doctrine->getEntityManager(); 所有服

我在symfony 2中定义了几个服务,这些服务将更改持久化到数据库中。 这些服务将条令实例作为其依赖项之一:

a.given.service:
    class: Acme\TestBundle\Service\AGivenService
    arguments: [@doctrine]
如果我有两个不同的服务,并且它们都通过EntityManager持久化对象,这是从doctrine实例获得的:

$em = $doctrine->getEntityManager();
所有服务是否总是共享同一个EntityManager? 如果是这样,如果我想处理单个事务中的所有更改,我应该如何处理刷新? 我已经检查了这一点:它解释了如何在一个请求中处理不同的事务,但我想要实现的是在不同的服务中作为单个事务处理不同的更改

是否有更好的方法来处理不同服务中的多个更改


目前,我最好的选择是有一个前端服务,负责呼叫其他服务,然后进行刷新。后端服务将持久化对象,但不会进行任何刷新。

您引用的文档正是您想要的:

$em->getConnection()->beginTransaction();
try{
  $service1 = $this->get('myservice1');
  $service1->doSomething();

  $service2 = $this->get('myservice2');
  $service2->doSomething();

  $em->getConnection()->commit();
catch(\Exception $e){
  $em->getConnection()->rollback();
}

如果您的$em与容器中的$em相同,即您只使用一个实体管理器,则您现在可以在服务内部刷新,并在出现错误时回滚。

您是对的。从文档中的示例中,我没有意识到您可以在transacion内冲洗几次。我还忽略了“暂停自动提交”的评论。