使用Symfony 3.2(在Apache上运行PHP-FPM),我们提供了一个REST API,允许在请求中通过JSON有效负载POST新实体。
我们的API流量不高,但在此特定情况下,我们的前端会触发>同时向我们的API 发出20个POST请求。
今天是第一次(此应用程序自3年后开始运行),我们在生产中收到了以下错误消息之一:
完整性约束违规:1062重复输入' 5372'关键' PRIMARY'在/ home / vcap / app / vendor / doctrine / dbal / lib / Doctrine / DBAL / Driver / PDOStatement.php`(...)
Doctrine \ DBAL \ Exception \ UniqueConstraintViolationException:执行' INSERT INTO our_entity(ourfield1,ourfield2,ourfield3,...)VALUES(?,?,?,?,?,?,?, ?,?,...
不幸的是,我们的生产登录停在这里,这是另一个问题
我们不做
最后它是一个简单的
// Step 1 - create and flush new Entity
$newEntity = new OurEntity();
$newEntity->setValues($valuesFromJsonPayload);
$em->persist($newEntity);
$em->flush();
// Step 2 - get ID and store it with another object
$em->refresh($newEntity);
$generatedId = $newEntity->getId();
$history = new History();
$history->setNewId($generatedId);
$em->persist($history);
$em->flush();
我甚至不明白为什么我会在这里提及第2步,因为根据错误消息显然会出现 Step 1 的问题。
在我们要求我们的用户再次执行相同的操作后,它就像一个魅力。
为什么会发生这种情况的任何想法?
答案 0 :(得分:0)
这可能有点偏离主题,但是:
我不建议使用ID的数据库自动增量。
您可以使用Uuid library。 ID将是随机哈希字符串。您的实体对象将具有ID并在实例化时立即生效。而且您不必将其保存到数据库中以获取ID。
就在昨天我给了一个类似的answer。看看其余的故事和参考资料。