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

时间:2012-03-19 23:26:13

标签: doctrine symfony

我已经在symfony 2中定义了几个服务,这些服务会持续更改数据库。 这些服务将doctrine实例作为其依赖项之一:

a.given.service:
    class: Acme\TestBundle\Service\AGivenService
    arguments: [@doctrine]

如果我有两个不同的服务,并且它们都通过EntityManager持久保存对象,这是从doctrine实例中获得的:

$em = $doctrine->getEntityManager();

所有服务是否始终共享同一个EntityManager? 如果是这样,如果我想处理单个事务中的所有更改,我应该如何处理刷新? 我已经检查了这个:http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/transactions-and-concurrency.html它解释了如何处理请求中的不同事务,但我想要实现的是在作为单个事务处理的不同服务中进行不同的更改。

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

现在我最好的选择是拥有一个前端服务,负责调用其他服务并在之后进行刷新。后端服务会持久保存对象,但不会进行任何刷新。

1 个答案:

答案 0 :(得分:3)

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

$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相同,即您只使用一个实体管理器,则现在可以刷新服务内部并在发生错误时回滚。