我在 symfony 2 中定义了几个服务,它们可以保存对数据库的更改。 这些服务将学说实例作为其依赖项之一:
a.given.service:
class: Acme\TestBundle\Service\AGivenService
arguments: [@doctrine]
如果我有两个不同的服务,并且它们都通过 EntityManager 持久化对象,这是从学说实例中获取的:
$em = $doctrine->getEntityManager();
所有服务是否始终共享同一个 EntityManager? 如果是这样,如果我想处理单个事务中的所有更改,我应该如何处理刷新? 我已经检查过:http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/transactions-and-concurrency.html,它解释了如何处理不同的事务请求,但我想要实现的是将不同服务中的不同更改作为单个事务处理。
是否有更好的方法来处理不同服务中的多个变更?
目前我最好的选择是让前端服务负责调用其他服务并随后进行刷新。后端服务将持久化对象,但不会进行任何刷新。
您引用的文档正是您想要的:
$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
与容器中的相同,即您仅使用一个实体管理器,那么您现在可以刷新服务内部并在发生错误时回滚。