Доктрина 2: Транзакция не работает

1

Код, обработанный моей просьбой (только цель тестирования):

$em->beginTransaction();
try {
    $repository = $em->getRepository(User::class);
    /** @var User $entity */
    $entity = $repository->findOneBy(['user' => 1]);
    $em->lock($entity, LockMode::PESSIMISTIC_WRITE);
    // $em->refresh($entity); Would solve the problem. See edit at bottom.
    $entity->increase(1); // just an integer field will be increased

    sleep(2);

    $em->persist($entity);

    $em->flush();
    $em->commit();
} catch (\Exception $e) {
    $em->rollback();
    throw $e;
}

Когда я запускаю два запроса (обрабатываются разными детьми Nginx), происходит следующее:

  1. Перед запросами: номер 30
  2. Запрос 1 уволен
  3. Запрос 2 уволен
  4. Запрос 1 завершен. Число - 31
  5. Запрос 2 завершен. Число - 31

Я ожидаю 32 после окончания второго запроса, так как внутри набора транзакций есть блокировки записи. Почему это не работает?

Изменение: мне нужно добавить $em->refresh($entity) чтобы заставить его работать. Но мне интересно, нужно ли мне делать это вручную каждый раз.

Теги:
nginx
doctrine2

1 ответ

0

Кажется, решение с выполнением $em->refresh($entity) - это способ сделать это. Я спросил разработчика Doctrine 2.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню