如何使用Doctrine锁定MAX()值的读取?

时间:2013-12-04 12:36:42

标签: symfony doctrine-orm locking

我有一个表,在写新行时,我得到MAX(grouping_id)的值并添加一个。然后我保存了一堆具有相同grouping_id值的行。问题是我在grouping_id中发生了一些冲突。两组独立的数据从MAX()读取了相同的值。我的代码如下所示:

    $em->transactional(function($em) use ($data) {
        $max_grouping_id = $em->getRepository('FormData')
            ->createQueryBuilder('fd')
            ->select('MAX(fd.grouping_id)')
            ->getQuery()
            ->getSingleScalarResult()
        ;

        settype($max_grouping_id, 'int');
        $grouping_id = $max_grouping_id+1;

        foreach($data as $formdata) {
            $formdata->setGroupingId($grouping_id);
            $em->persist($formdata);
        }
    });

    try {
        $em->flush();
    } catch(\Exception $e) {
        return $this->redirect(/* */);
    }

我已经为$formdata个实体设置了所有其他数据。

所以我需要锁定对MAX(fd.grouping_id)的值的读取,以便在我完成刷新formdata实体之前,并发请求将无法读取该值。但是可以锁定计算值吗?该数据库是MySQL InnoDB。

我只有很少的碰撞,但它们永远不会少。

0 个答案:

没有答案