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

我的应用程序具有3个实体:LoanSystemPageTextPage。每当有人添加贷款时,就会将一个或多个系统页面添加到数据库中。基本上,它是这样的:

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();
}

请忽略潜在的错别字,我在记住时是按字面意思写的

实体Loan映射到表loans,并且SystemPage映射(通过继承映射)到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

这个理论有两个问题:
  • 交易。这就是为什么我首先使用它们
  • 在发生错误时,其他用户在应用程序上没有其他事件

  • 重要提示:WAITING一分钟后,重新提交通过了OK。

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

    编辑:

    数据库模式的一部分:

    php - 交易期间键 '...'的重复条目 'PRIMARY'-LMLPHP

    请忽略使用塞尔维亚语的列名

    最佳答案

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

    您没有说明是否可以重现此错误,并且如果您可以提供数据库模式,那将很方便。

    10-06 08:51