Symfony 如何使用命令将读取锁定在MAX()值上?

Symfony 如何使用命令将读取锁定在MAX()值上?,symfony,doctrine-orm,locking,Symfony,Doctrine Orm,Locking,我有一个表,当我写新行时,我得到MAX(grouping\u id)的值并添加一个。然后,我保存了一组具有相同grouping\u id值的行。问题是在分组\u id中有一些冲突。两组独立的数据从MAX()读取了相同的值。我的代码如下所示: $em->transactional(function($em) use ($data) { $max_grouping_id = $em->getRepository('FormData') -&

我有一个表,当我写新行时,我得到
MAX(grouping\u id)
的值并添加一个。然后,我保存了一组具有相同
grouping\u id
值的行。问题是在
分组\u 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\u id)
的值上锁定读取,以便在我完成刷新formdata实体之前,并发请求将无法读取该值。但是否可以锁定计算值?数据库是MySQL InnoDB


我只遇到过很少的碰撞,但它们从未减少过。

此外,我们还感谢其他建议的解决碰撞问题的方法。可能会将随机散列与
分组\u id一起添加或替换。为什么不使用自动递增的id?我需要几个具有相同
分组\u id的行。主键(不是grouping_id)是自动递增的,我想如果可以使用doctor/MySQL有两个自动递增的列,那么我可以先保存一行,然后保存其余的。如果前一个增量值存在几次,它是否会正确增量?确定。对不起,我不知道有两个纵队。也许您可以使用具有多人关系的
实体来管理您的组。