多くのアプリケーションがアクセスする製品テーブルがあり、それぞれに複数のユーザーがいます。衝突を回避したいのですが、コードのごく一部で衝突が発生する可能性があることがわかりました。
$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.
}
1 つのオプションは、状態変更直後の最初のmake 2persist()
とですが、それを行う前により多くの保証を提供する方法があるかどうかを知りたいです。flush()
プロセスには実際には他にも多くのアクションが含まれているため、トランザクションは解決策ではないと思います。そのため、それらをトランザクションにラップすると、多くのロールバックと失敗した販売が強制され、さらに悪化します。
そのデータベースは Postgress です。
他のアイデアはありますか?