- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个 Symfony 应用程序,它公开了移动应用程序使用的一组 JSON 网络服务。
在过去的几天里,我们有 许多并发用户 使用该应用程序(每天约 5000 次访问),并且 Doctrine 错误开始“随机”出现在我的日志中。它每天大约出现 2-3 次,这是错误:
Uncaught PHP Exception Doctrine\DBAL\Exception\DriverException: "An exception occurred while executing 'UPDATE fos_user_user SET current_crystals = ?, max_crystals = ?, updated_at = ? WHERE id = ?' with params [31, 34, "2017-12-19 09:31:18", 807]:
SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction" at /var/www/html/rollinz_cms/releases/98/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php line 115
更新用户表时似乎无法获得锁。 Controller 代码如下:
/**
* @Rest\Post("/api/badges/{id}/achieve", name="api_achieve_badge")
*/
public function achieveAction(Badge $badge = null)
{
if (!$badge) {
throw new NotFoundHttpException('Badge not found.');
}
$user = $this->getUser();
$em = $this->getDoctrine()->getManager();
$userBadge = $em->getRepository('AppBundle:UserBadge')->findBy(array(
'user' => $user,
'badge' => $badge,
));
if ($userBadge) {
throw new BadRequestHttpException('Badge already achieved.');
}
$userBadge = new UserBadge();
$userBadge
->setUser($user)
->setBadge($badge)
->setAchievedAt(new \DateTime())
;
$em->persist($userBadge);
// sets the rewards
$user->addCrystals($badge->getCrystals());
$em->flush();
return new ApiResponse(ApiResponse::STATUS_SUCCESS, array(
'current_crystals' => $user->getCurrentCrystals(),
'max_crystals' => $user->getMaxCrystals(),
));
}
我调查了 MySQL和 Doctrine 文档,但我找不到可靠的解决方案。 Doctrine 建议重试交易,但没有显示实际示例:
https://dev.mysql.com/doc/refman/5.7/en/innodb-deadlock-example.html
try {
// process stuff
} catch (\Doctrine\DBAL\Exception\RetryableException $e) {
// retry the processing
}
This posts建议重试交易。我该怎么做?
会不会是服务器问题(访问太多),我必须提升服务器,或者代码有误,我必须明确处理代码中的死锁?
最佳答案
这是一个 MySQL 问题。多个并发事务阻塞相同的资源。
检查您是否有可能长时间阻塞记录的 cronjobs。
否则只是并发请求更新相同的数据,您可能更了解这些数据在哪里更新。
在 php 中重试的肮脏尝试:
$retry=0;
while (true) {
try {
// some more code
$em->flush();
return new ApiResponse(ApiResponse::STATUS_SUCCESS, array(
'current_crystals' => $user->getCurrentCrystals(),
'max_crystals' => $user->getMaxCrystals(),
));
} catch (DriverException $e) {
$retry++;
if($retry>3) { throw $e; }
sleep(1); //optional
}
}
关于php - 教义异常 : Deadlock found when trying to get lock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47885232/
我想检测不等于 1,2,3 或 NULL 的 id。这是我的查询: $qb = $this->_em->createQueryBuilder() ->select('u.cityId')
tl;博士 我有一个有效的 SQL 查询,它从 SQL 命令行返回行,但通过 Doctrine 提交时则不会。我认为问题在于我如何设置ResultSetMapper。我读过docs关于 native
我正在创建只有两个实体的小型应用程序,Order 和 Shipment。 Shipment 实体如下:(为了简短起见删除了方法) /** * @var integer $id * * @ORM\
是否可以在 Doctrine 2 中指定 unsigned integer 的列类型? 最佳答案 /** * @ORM\Column(name="id", type="integer", option
有谁知道有没有使用 Doctrine 而不使用 DQL 的快速方法来获取表中的所有记录。 我错过了什么,还是你需要在类里面编写公共(public)函数? 最佳答案 如果你有一个实体类( Doctrin
我在 MySQL 中有这个查询,我想应用到学说中 SELECT * FROM ads_list AS al LEFT JOIN (ads_category AS ac, ads_category_ma
让我们看看我的类(class)。可以看到,Model中有Batteries,这是ManyToMany的关系。模型还有 1 block 电池,这是数量最多的电池之一。 例如,我想选择电池(不是任何一个电
也许有人可以帮我改造 我试图通过 page_id 获取与 theFaqPageQuestionContent 无关的 QuestionContent 并在选择框中查看它 SELECT q FROM V
我正在尝试使用表情符号保存文本。然而,表情符号不存储在文本中。我得到的不是表情符号,而是 ? 在数据库中。 # Doctrine Configuration doctrine: dbal
我正在尝试使用方法 ArrayCollection::contains 来查找对象是否已经在我的集合中,但是当我这样做时: //My ArrayCollection $lesRoles = $drt-
我正在使用 Doctrine's 2 Tree-Nestedset extension使用 MySQL IndoDB 数据库。 yml 表架构如下所示: Ext\Entity\PageElement:
我该怎么办 WHERE id != 1 在教义中? 到目前为止我已经有了 $this->getDoctrine()->getRepository('MyBundle:Image')->findById
使用具有结构的表: id | count /string/id1 | 3 /string/id1/r1 | 2 /string/id1/r2 | 1 /strin
DBAL 查询生成器: http://www.doctrine-project.org/api/dbal/2.3/class-Doctrine.DBAL.Query.QueryBuilder.html
使用 Doctrine,我的实体中有 fetch=EAGER : class TrainingOrganization { /** * @var TrainingOrganizati
我只是想知道 Doctrine 与 Symfony 中双向关系的优点/缺点是什么? 我所有的关系都是双向的,但我不确定这是否会导致问题...... 谢谢。 最佳答案 只要您不将关系标记为EAGER,我
使用具有结构的表: id | count /string/id1 | 3 /string/id1/r1 | 2 /string/id1/r2 | 1 /strin
我正在寻找一种将数组转换为学说实体的方法。我正在使用原则 2。 我有一个实体类,例如: class User { /** * @Id * @Column(type="int
所以我有这两个类,它们之间有 OneToMany 和 ManyToOne 关系: 命名空间 RM\Entity; 使用 Doctrine\Common\Collections\ArrayCollect
我有一个Application与 ApplicationFile 有关系: /** * @ORM\OneToMany( * targetEntity="AppBundle\Entity\App
我是一名优秀的程序员,十分优秀!