Ich versuche Pessimistic Locking mit Doctrine ORM für PostgreSql zu verwenden. Doctrine und PostgreSql mit Standardkonfigurationen (ohne Änderungen).Doktrin (postgresql) Pessimistische Sperre - wirft keine PessimisticLockException
Dies ist ein Codebeispiel (Symfony-Befehl).
$sleep
- das ist die Zeit in Sekunden
$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;
}
Wie getestet
Run zwei Befehle. Der erste Befehl wird mit einem Timeout von 20 Sekunden ausgeführt. Der zweite Befehl wird ohne Zeitüberschreitung ausgeführt.
Erwartetes Ergebnis
Zweiter Befehl wirft PessimisticLockException
Tatsächliches Ergebnis
Zweiten Befehl wartet auf erst Transaktionscommit und aktualisiert Reihe.
Frage
Was soll ich tun, um Lehre PessimisticLockException
zu machen werfen, wenn Zeile jetzt gesperrt ist?