我正在编写一个
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回滚交易呢?
死锁返回错误1213,您应该在客户端处理该错误
请注意,死锁和锁定等待是不同的事情.陷入僵局,没有“失败”的交易:他们都有罪.无法保证哪一个将被回滚.
您必须使用回滚,您的样式代码将插入重复.例如你应该:
$retry = 0; $done = false; $this->entityManager->getConnection()->beginTransaction(); // suspend auto-commit while (!$done and $retry < 3) { try { $this->entityManager->flush(); $this->entityManager->getConnection()->commit(); // commit if succesfull $done = true; } catch (\Exception $e) { $this->entityManager->getConnection()->rollback(); // transaction marked for rollback only $retry++; } }
希望这有帮助.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。