Я пытаюсь использовать пессимистическую блокировку с доктриной ORM для PostgreSql. Doctrine и PostgreSql с настройками по умолчанию (без каких-либо изменений).Доктрина (postgresql) Пессимистическая блокировка - не бросает PessimisticLockException
Это пример кода (Symfony Command).
$sleep
- это время в секундах
$manager = $this->getContainer()->get('mmi.manager.message');
$conn = $manager->em()->getConnection();
$manager->em()->getConnection()->beginTransaction();
try {
$entity = $manager->repo()->find('cd7eb9e9', LockMode::PESSIMISTIC_WRITE);
$entity->setState(EntityActionInterface::STATE_IN_PROGRESS);
$manager->em()->persist($entity);
$manager->em()->flush();
$ts = (new \DateTime())->getTimestamp();
$output->writeln("TS: {$ts}");
if ($sleep) {
$output->writeln("Sleep: {$sleep}");
sleep($sleep);
}
$entity->setMessage([$ts]);
$manager->em()->persist($entity);
$manager->em()->flush();
$conn->commit();
} catch (PessimisticLockException $ex) {
var_dump(get_class($ex));
$conn->rollBack();
throw $ex;
} catch (\Exception $ex) {
var_dump(get_class($ex));
$conn->rollBack();
throw $ex;
}
Как тестируемых
Выполнить две команды. Первая команда запускается с таймаутом 20 секунд. Вторая команда запускается без какого-либо таймаута.
Ожидаемый результат
Вторая команда бросает PessimisticLockException
Фактический результат
Second ждет команды для первой транзакции, а затем обновляет строку.
Вопрос
Что я должен сделать, чтобы бросить Доктрина PessimisticLockException
если строка теперь заблокирована?