我正在写一个PHP函数,它将大量数据存储到/更新到表中,并可能导致死锁。我试图调查如何重试失败的交易与教条,但可惜在网上找不到任何信息。我终于写了下面的代码如何使用Doctrine在死锁后重试事务?
$retry = 0;
$done = false;
while (!$done and $retry < 3) {
try {
$this->entityManager->flush();
$done = true;
} catch (\Exception $e) {
sleep(1);
$retry++;
}
}
if ($retry == 3) {
throw new Exception(
"[Exception: MySQL Deadlock] Too many people accessing the server at the same time. Try again in few minutes"
);
}
我的问题:是有机会这一做法将在数据库中插入重复?如果是这样,我该如何强制Doctrine回滚交易?
谢谢:)这至少给了我一个如何进行的想法。 – Rorchackh
事实上,这不再是事实,因为在Exception'EntityManager'进入关闭状态的情况下,它会抛出一个'ORMException',表示实体管理器在第二次尝试时关闭。 Doctrine 2.4版本。* – Mantas
这是关闭时如何重置entitymanager https://codedump.io/share/rjB45oiwtqwo/1/doctrine2-the-entitymanager-is-closed-how-to-reset-entity-manager-in- Symfony2的 –