Tydligen använder Doctrine 2 LÅS I DELAT LÄGE med pessimistiskt läslås för MySQL, vilket inte är samma sak som VÄLJ FÖR UPPDATERING.
Om man tittar på källorna till den nuvarande stabila utgåvan verkar det som om det inte finns något naturligt sätt att göra det i Doctrine (jag är inte säker på varför Doctrine-teamet valde den typen av lås för MySQL).
Jag använde inbyggd SQL som lösning, som kan mappas till de traditionella enheterna, som det skulle vara med DQL:
<?php
$rsm = new ResultSetMappingBuilder($this->_em);
$rsm->addRootEntityFromClassMetadata('Model_Record_Delivery', 'u');
$query = $this->_em->createNativeQuery("SELECT * FROM delivery WHERE id = :id FOR UPDATE", $rsm);
$query->setParameter("id", $id);
$result = $query->getOneOrNullResult();
Uppdatera
Som Benjamin har påpekat är PESSIMISTIC_WRITE vad du letar efter.
Med DQL
<?php
$query = $this->em->createQuery('SELECT e
FROM Application\Model\Entity\MyEntity e
WHERE e = :id');
$query->setParameter("id", $id);
$query->setLockMode(\Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE);
Utan DQL
<?php
$entity = $em->find('Application\Model\Entity\MyEntity', $id, \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE);
Du måste också använda uttalandet i en transaktion för att få det att fungera.