2012-03-19 26 views
3

我已經在symfony 2中定義了幾個服務,這些服務堅持對數據庫進行更改。 這些服務的學說實例作爲其依賴的一個:如何在symfony2中的不同服務之間共享的Doctrine EntityManager實例中處理衝突?

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它解釋瞭如何處理請求中的不同事務,但是我想實現的是將不同的服務作爲單個事務處理進行不同的更改。

是否有更好的方法來處理不同服務中的多個更改?

現在我最好的選擇是有一個前端服務負責調用其他服務並在之後進行刷新。後端服務將持久對象,但不會做任何沖洗。

回答

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是一樣的一個在你的容器,即你只使用一個實體管理器,你現在可以刷新如果發生錯誤,請在服務器內部回滾並回滾。

+0

你說得對。我從文檔中的例子中沒有意識到可以在交易內部沖洗數次。我也忽略了「暫停自動提交」的評論。 – Jens 2012-03-21 17:38:03

相關問題