在交易期间,键'PRIMARY'重复输入'...'

Jov*_*vic 5 php mysql transactions symfony doctrine-orm

这件事昨晚发生在我身上.我对错误的本质非常熟悉,但我仍然无法弄清楚可能导致错误的原因.我可能有预感,但我不确定.我将从一些基本应用程序的信息开始:

我的应用程序有3个实体:Loan,SystemPageTextPage.每当有人添加贷款时,都会向数据库添加一个或多个系统页面.基本上,它是这样的:

if ( $form->isValid()){
    $this->em->getConnection()->beginTransation();
    $this->em->persist($loan);
    $this->em->flush();

    while ($someCondition){
        $page = new SystemPage();
        //... Fill the necessary data into page
        $page->setObject($loan);
        $this->em->persist($page);
    }

    $this->em->flush();
    $this->em->getConnection()->commit();
}
Run Code Online (Sandbox Code Playgroud)

请忽略潜在的拼写错误,我通过记忆来写字面

实体Loan映射到表loansSystemPage映射(通过继承映射)到system_pagesbase_pages.后两者都有id设置为的字段AUTO_INCREMENT.

我的预感:还有另一张桌子叫做text_pages.鉴于text_pagesbase_pages一方面和system_pagesbase_pages另一个共享的ID,我想,这很容易导致此:

User1: Create BasePage, acquire autoincrement ID (value = 1)
User2: Create BasePage, acquire autoincrement ID (value = 1)
User1: Create TextPage, use the ID from step 1
User2: Create SystemPage, use the ID from step 2
Run Code Online (Sandbox Code Playgroud)

这个理论有两个问题:

  • 交易.这就是我首先使用它们的原因
  • 在发生错误时,其他用户在应用程序上没有其他活动

重要提示:等待一分钟后,重新提交确认.

这可能是一些奇怪的MySQL事务隔离错误吗?任何提示都将不胜感激......

编辑:

DB Schema的一部分:

在此输入图像描述

请忽略塞尔维亚语的列名

Nik*_*ica 1

lush() 操作刷新单个事务中的所有更改,因此这里有多余的代码......

您没有说明是否可以重现此错误,如果您可以提供数据库架构,将会很方便。