Код, обработанный моей просьбой (только цель тестирования):
$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), происходит следующее:
Я ожидаю 32 после окончания второго запроса, так как внутри набора транзакций есть блокировки записи. Почему это не работает?
Изменение: мне нужно добавить $em->refresh($entity)
чтобы заставить его работать. Но мне интересно, нужно ли мне делать это вручную каждый раз.
Кажется, решение с выполнением $em->refresh($entity)
- это способ сделать это. Я спросил разработчика Doctrine 2.