昨晚这件事发生在我身上。我对错误的性质非常熟悉,但仍然无法弄清楚是什么原因引起的。我可能有预感,但是我不确定。我将从一些基本的应用程序信息开始:
我的应用程序具有3个实体:Loan
,SystemPage
和TextPage
。每当有人添加贷款时,就会将一个或多个系统页面添加到数据库中。基本上,它是这样的:
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_pages
和base_pages
。后两者都具有id
字段,该字段设置为AUTO_INCREMENT
。我的直觉:还有一个名为
text_pages
的表。考虑到一方面text_pages
和base_pages
以及另一的system_pages
和base_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
事务隔离错误吗?任何提示将不胜感激...编辑:
数据库模式的一部分:
请忽略使用塞尔维亚语的列名
最佳答案
flush()操作刷新单个事务中的所有更改,因此这里有多余的代码...
您没有说明是否可以重现此错误,并且如果您可以提供数据库模式,那将很方便。