原则:在更新中避免冲突



我有一个由许多应用程序访问的产品表,每个表中有几个用户。我想避免冲突,但是在我检测到的一小部分代码中可能发生冲突。

$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(),第一个是在状态改变之后,但在这样做之前,我想知道是否有一种方法可以提供更多的保证。

我不认为事务是一个解决方案,因为实际上在这个过程中涉及到许多其他操作,因此,将它们包装在事务中会强制执行许多回滚和失败的销售,使情况变得更糟。

数据库是Postgress。

还有其他想法吗?

我首先想到的是乐观锁定。最终的结果是,如果有人从您下面更改了底层数据,doctrine将在flush时抛出异常。然而,这可能并不容易,因为您说您有多个应用程序在一个中央数据库上操作——您不清楚是否可以控制这些应用程序,而您需要控制这些应用程序,因为它们都需要使用乐观锁定方案,并在运行更新时更新版本列。

最新更新