我有一个由许多应用程序加入的产品表,每个应用程序中有几个用户。我想避免碰撞,但在很小的代码中我检测到了碰撞。
$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()
,第一个是在状态改变之后,但在做之前我想知道是否有一种方法可以提供更多保证。< / p>
我不认为交易是一种解决方案,因为该流程实际上涉及许多其他操作,因此将它们包装在交易中将会导致许多回滚和销售失败,从而使其变得更糟。
Tha数据库是Postgress。
还有其他想法吗?
答案 0 :(得分:0)
我的第一个想法是看optimistic locking。最终的结果是,如果某人更改了您之下的基础数据,则doctrine将在flush上抛出异常。但是,这可能并不容易,因为你说你有多个应用程序在一个中央数据库上运行 - 你不清楚你是否可以控制这些应用程序,你需要,因为他们都需要一起玩使用乐观锁定方案并在运行更新时更新版本列。