我嘗試使用悲觀鎖定與Doctrine ORM for PostgreSql。 Doctrine和PostgreSql默認配置(沒有任何改變)。學說(postgresql)悲觀鎖定 - 不拋出PessimisticLockException
這是代碼示例(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
如果行已被鎖定?