2013-06-05 128 views
0

避免衝突我有許多應用程序accesed產品表,在每一個幾個用戶。我想避免碰撞,但是在我檢測到的很小一部分代碼中,可能會發生碰撞。學說:在更新

$item = $em->getRepository('MyProjectProductBundle:Item') 
      ->findOneBy(array('product'=>$this, 'state'=>1)); 

if ($item) 
{ 
    $item->setState(3); 
    $item->setDateSold(new \DateTime("now")); 
    $item->setDateSent(new \DateTime("now")); 

    $dateC = new \DateTime("now"); 
    $dateC->add(new \DateInterval('P1Y')); 
    $item->setDateGuarantee($dateC); 

    $em->persist($item); 
    $em->flush(); 

    //...after this, set up customer data, etc. 
} 

一種選擇是讓2 persist()flush(),只是狀態改變後的第一個,但這樣做之前,我想知道是否有一種方式,提供了更多的保障。

我不認爲交易是一個解決方案,因爲有參與這一進程所以實際上很多其他的行動,在事務包裹起來會迫使許多回滾和失敗的sellings,使情況變得更糟。

臨屋的數據庫是Postgress。

還有其他想法嗎?

+1

如果你正在從倉庫中堅持它的項目將再次嘗試重新插入。檢索完項目後,您可以更改項目設置,然後您只需調用flush()即可更新它們。如果您試圖保存一個新的,您只需要調用persist()。 – Chausser

+0

我不知道這一點,這將是我的短期解決方案,謝謝 –

回答

0

我首先想到的是看optimistic locking。最終的結果是,如果有人從你的底下改變了基礎數據,則學說將在刷新時拋出異常。然而,這可能並不容易,因爲你說你有多個應用程序在中央數據庫上運行 - 目前還不清楚你是否可以控制這些應用程序,而且你需要,因爲它們都需要一起玩使用樂觀鎖定方案並在運行更新時更新版本列。

+0

我沒有對這些應用程序的控制,但是這是個不錯的辦法。我的意思是,在短期內對我來說不是一個解決方案,因爲我無法控制應用程序甚至不能控制數據庫,但它可能是這些應用程序的未來版本的好方法。謝謝 –