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;
}
テスト方法
2 つのコマンドを実行します。最初のコマンドは、タイムアウト 20 秒で実行されます。2 番目のコマンドは、タイムアウトなしで実行されます。
期待される結果
2 番目のコマンド スローPessimisticLockException
実結果
2 番目のコマンドは、最初のトランザクションのコミットを待ってから行を更新します。
質問
PessimisticLockException
行がロックされている場合、Doctrine をスローさせるにはどうすればよいですか?