Symfony 删除实体从不刷新
Symfony remove entity never flushes
我的应用程序有一个表单来管理用户角色。在提交表单时,当检测到角色更改时,必须从会话中删除用户的会话记录 table:
$form = $this->createForm('AppBundle\Form\UserType', $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$user->setRoles($this->setUserRoles($user));
$changed = $this->checkChanged($em->getUnitOfWork()->getOriginalEntityData($user), $request->request->get('app_user_profile'));
if ($changed) {
// $sql = "DELETE FROM sessions WHERE sess_id = '".$user->getSessId()."'";
// $em->getConnection()->exec($sql);
// $em->getConnection()->commit();
$entity = $em->getRepository('AppBundle:Sessions')->find($user->getSessId());
if ($entity) {
$em->remove($entity);
// $em->flush($entity);
}
$user->setSessId(null);
}
$em->persist($user);
$em->flush();
return $this->redirectToRoute('users_list');
}
但是此代码执行会导致异常 SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction
我注释掉了我尝试过但结果相同的代码。 MySql 日志文件显示删除命令后暂停 10 秒,我不知道它在等什么,也不知道为什么 $em->getConnection()->commit();
在那里不起作用:
2017-08-09T10:02:36.334195Z 217 Connect user@localhost on mydb using TCP/IP
2017-08-09T10:02:36.336556Z 217 Query SELECT t0.username AS username_1, <...> FROM fos_user t0 WHERE t0.id = 1 LIMIT 1
2017-08-09T10:02:36.373640Z 217 Query DELETE FROM sessions WHERE sess_id = '1gjo6har0vttn7ru63pjrptti4'
2017-08-09T10:03:27.489764Z 216 Query INSERT INTO sessions (sess_id, sess_data <...>
- 您的 table 中有多少会话行?
- 您的 sessions.sess_id 列有索引吗?
- 您是否尝试过 运行 使用 mysql CLI 或 phpmyadmin 进行此查询?
- 你是否在一些真实用户使用的应用程序上测试你的代码,如果是的话
大约有多少?
请删除您的会话和用户实体代码以检查关系
你的回答将帮助我回答你。
PS: 抱歉,由于我的声誉 (<50),我不能写评论
最后我发现这种奇怪的行为只适用于当前登录的用户。因此,对于当前用户,应该完成简单的注销:
if ($user->getId() == $this->getUser()->getId()) {
return $this->redirectToRoute('fos_user_security_logout');
}
我的应用程序有一个表单来管理用户角色。在提交表单时,当检测到角色更改时,必须从会话中删除用户的会话记录 table:
$form = $this->createForm('AppBundle\Form\UserType', $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$user->setRoles($this->setUserRoles($user));
$changed = $this->checkChanged($em->getUnitOfWork()->getOriginalEntityData($user), $request->request->get('app_user_profile'));
if ($changed) {
// $sql = "DELETE FROM sessions WHERE sess_id = '".$user->getSessId()."'";
// $em->getConnection()->exec($sql);
// $em->getConnection()->commit();
$entity = $em->getRepository('AppBundle:Sessions')->find($user->getSessId());
if ($entity) {
$em->remove($entity);
// $em->flush($entity);
}
$user->setSessId(null);
}
$em->persist($user);
$em->flush();
return $this->redirectToRoute('users_list');
}
但是此代码执行会导致异常 SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction
我注释掉了我尝试过但结果相同的代码。 MySql 日志文件显示删除命令后暂停 10 秒,我不知道它在等什么,也不知道为什么 $em->getConnection()->commit();
在那里不起作用:
2017-08-09T10:02:36.334195Z 217 Connect user@localhost on mydb using TCP/IP
2017-08-09T10:02:36.336556Z 217 Query SELECT t0.username AS username_1, <...> FROM fos_user t0 WHERE t0.id = 1 LIMIT 1
2017-08-09T10:02:36.373640Z 217 Query DELETE FROM sessions WHERE sess_id = '1gjo6har0vttn7ru63pjrptti4'
2017-08-09T10:03:27.489764Z 216 Query INSERT INTO sessions (sess_id, sess_data <...>
- 您的 table 中有多少会话行?
- 您的 sessions.sess_id 列有索引吗?
- 您是否尝试过 运行 使用 mysql CLI 或 phpmyadmin 进行此查询?
- 你是否在一些真实用户使用的应用程序上测试你的代码,如果是的话 大约有多少?
请删除您的会话和用户实体代码以检查关系
你的回答将帮助我回答你。
PS: 抱歉,由于我的声誉 (<50),我不能写评论
最后我发现这种奇怪的行为只适用于当前登录的用户。因此,对于当前用户,应该完成简单的注销:
if ($user->getId() == $this->getUser()->getId()) {
return $this->redirectToRoute('fos_user_security_logout');
}