私のアプリケーションには、ユーザーロールを管理するフォームがあります。私は私がしようとしているコードをコメントアウトSymfonyの削除エンティティは一切フラッシュされません
$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 [email protected] 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 <...>
私はあなたの問題の原因を知らないが、私はあなたが[PdoSessionHandler]を使用することをお勧め:だから、現在のユーザーのための簡単なログアウトを行うべきですdoctrine/pdo_session_storage.html)を使用してセッションをデータベースに格納し、[EquatableInterface](http://api.symfony.com/3.3/Symfony/Component/Security/Core/User/EquatableInterface.html)を実装して、ユーザーの役割が変わる。 – DrKey