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