Apparemment, Doctrine 2 utilise LOCK IN SHARED MODE avec un verrou de lecture pessimiste pour MySQL, ce qui n'est pas la même chose que SELECT FOR UPDATE.
En regardant les sources de la version stable actuelle, il semble qu'il n'y ait pas de manière native de le faire dans Doctrine (je ne sais pas pourquoi l'équipe Doctrine a choisi ce type de verrou pour MySQL).
J'ai utilisé SQL natif comme solution de contournement, qui peut être mappée aux entités traditionnelles, comme ce serait le cas avec 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();
Mettre à jour
Comme Benjamin l'a souligné, PESSIMISTIC_WRITE est ce que vous recherchez.
Avec 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);
Sans DQL
<?php
$entity = $em->find('Application\Model\Entity\MyEntity', $id, \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE);
De plus, vous devez utiliser l'instruction à l'intérieur d'une transaction pour que cela fonctionne.