0

多くのアプリケーションがアクセスする製品テーブルがあり、それぞれに複数のユーザーがいます。衝突を回避したいのですが、コードのごく一部で衝突が発生する可能性があることがわかりました。

$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 です。

他のアイデアはありますか?

4

1 に答える 1

0

私の最初の考えは、楽観的ロックを見ることです。最終結果は、誰かがあなたの下から基礎となるデータを変更した場合、doctrine はフラッシュ時に例外をスローするということです。ただし、これは簡単ではないかもしれません。なぜなら、中央データベースで複数のアプリケーションが動作していると言われているからです。それらのアプリケーションを制御できるかどうかは明らかではありません。オプティミスティック ロック スキームを使用して、更新の実行時にバージョン カラムを更新します。

于 2013-06-05T22:00:09.107 に答える