각 애플리케이션마다 여러 명의 사용자가있는 제품 테이블이 있습니다. 충돌을 피하고 싶지만 코드의 아주 작은 부분에서 충돌이 발생할 수 있음을 발견했습니다.Doctrine : 업데이트에서 충돌을 피하십시오.
$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()
, 단지 상태 변경 후 첫 일을 할 수 있지만, 그 일을하기 전에 좀 더 보장을 제공하는 방법이 있는지 알고 싶습니다.
실제로 트랜잭션에 포함 된 많은 다른 작업이 있으므로 트랜잭션에서이를 래핑하면 많은 롤백과 실패한 판매가 발생하여 악화 될 수 있으므로 트랜잭션이 해결책이라고 생각하지 않습니다.
그 데이터베이스는 게시 중입니다.
다른 아이디어?
저장소에서 항목을 계속 가져 오면 저장소를 다시 유지하면 항목을 다시 삽입하려고 시도합니다. 항목을 검색 한 후 항목 설정을 변경할 수 있으면 flush()를 호출하여 업데이트해야합니다. 새로운 것을 저장하려고하는 경우에만 persist()를 호출하면됩니다. – Chausser
나는 이것을 알지 못했다. 이것은 나의 단기 해결책이 될 것이다. –