在PRIMARY

时间:2017-04-05 12:23:45

标签: php symfony doctrine-orm

使用Symfony 3.2(在Apache上运行PHP-FPM),我们提供了一个REST API,允许在请求中通过JSON有效负载PO​​ST新实体。

我们的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(?,?,?,?,?,?,?, ?,?,...

不幸的是,我们的生产登录停在这里,这是另一个问题

我们不做

  1. 此处的任何更新(不是之前和之后)
  2. 我们没有其他唯一约束验证
  3. 我们对标准 MariaDB数据库使用标准 Auto-ID-Generator
  4. 当然在
  5. 之前我们的数据库中没有存在此ID的实体

    最后它是一个简单的

    // 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 的问题。

    在我们要求我们的用户再次执行相同的操作后,它就像一个魅力。

    为什么会发生这种情况的任何想法?

1 个答案:

答案 0 :(得分:0)

这可能有点偏离主题,但是:

我不建议使用ID的数据库自动增量。

您可以使用Uuid library。 ID将是随机哈希字符串。您的实体对象将具有ID并在实例化时立即生效。而且您不必将其保存到数据库中以获取ID。

就在昨天我给了一个类似的answer。看看其余的故事和参考资料。