我有一个由许多应用程序访问的产品表,每个表中有几个用户。我想避免冲突,但是在我检测到的一小部分代码中可能发生冲突。
$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时抛出异常。然而,这可能并不容易,因为您说您有多个应用程序在一个中央数据库上操作——您不清楚是否可以控制这些应用程序,而您需要控制这些应用程序,因为它们都需要使用乐观锁定方案,并在运行更新时更新版本列。