2017-08-09 14 views
1

私のアプリケーションには、ユーザーロールを管理するフォームがあります。私は私がしようとしているコードをコメントアウト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 <...> 
+0

私はあなたの問題の原因を知らないが、私はあなたが[PdoSessionHandler]を使用することをお勧め:だから、現在のユーザーのための簡単なログアウトを行うべきですdoctrine/pdo_session_storage.html)を使用してセッションをデータベースに格納し、[EquatableInterface](http://api.symfony.com/3.3/Symfony/Component/Security/Core/User/EquatableInterface.html)を実装して、ユーザーの役割が変わる。 – DrKey

答えて

0

は、最後に私は、この奇妙な行動が唯一の現在ログオンするユーザーを適用することを見つけます。 https://symfony.com/doc/current/(

if ($user->getId() == $this->getUser()->getId()) { 
    return $this->redirectToRoute('fos_user_security_logout'); 
} 
0
  • セッション行は、あなたのテーブルに持っているどのように多くの?
  • sessions.sess_id列にインデックスがありますか?
  • mysql CLIまたはphpmyadminでこのクエリを実行しようとしましたか?
  • 実際のユーザーが使用しているアプリケーションでコードをテストしていますか?はいの場合 ?

はあなたに答えるに私を助ける関係に

あなたの答えをチェックするために、あなたのセッションとユーザエンティティコードをドロップしてください。

PS:申し訳ありませんが、私が原因私の評判にコメントを書き込むことはできません(< 50)

関連する問題