我有一个表,在写新行时,我得到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。
我只有很少的碰撞,但它们永远不会少。