我尝试对 PostgreSql 使用带有 Doctrine ORM 的悲观锁定。具有默认配置的 Doctrine 和 PostgreSql(没有任何更改)。
这是代码示例(Symfony 命令)。
$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
实际结果
第二个命令等待第一个事务提交,然后更新行。
问题
PessimisticLockException
如果行现在被锁定,我应该怎么做才能让 Doctrine 抛出?