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   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 <...>

1

Решение

  • Сколько строк сеанса у вас есть в вашей таблице?
  • У вас есть индекс в вашем столбце sessions.sess_id?
  • Вы пытались выполнить этот запрос с помощью mysql CLI или phpmyadmin?
  • Тестируете ли вы свой код в приложении, используемом некоторыми реальными пользователями, если да
    примерно сколько?

Пожалуйста, оставьте свой сеанс и код объекта пользователя, чтобы проверить связь

Ваши ответы помогут мне ответить вам.

PS: Извините, но я не могу написать комментарий из-за моей репутации (<50)

0

Другие решения

Наконец, я обнаружил, что это странное поведение относится только к зарегистрированному пользователю. Таким образом, для текущего пользователя должен быть сделан простой выход из системы:

if ($user->getId() == $this->getUser()->getId()) {
return $this->redirectToRoute('fos_user_security_logout');
}
0

По вопросам рекламы [email protected]