Doctrine 2 zjevně používá ZÁMEK VE SDÍLENÉM REŽIMU s pesimistickým zámkem čtení pro MySQL, což není totéž jako SELECT FOR UPDATE.
Při pohledu na zdroje aktuální stabilní verze se zdá, že v Doctrine neexistuje žádný nativní způsob, jak toho dosáhnout (nejsem si jistý, proč tým Doctrine zvolil tento typ zámku pro MySQL).
Jako řešení jsem použil nativní SQL, které lze namapovat na tradiční entity, jako by tomu bylo u 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();
Aktualizovat
Jak Benjamin zdůraznil, PESSIMISTIC_WRITE je to, co hledáte.
S 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);
Bez DQL
<?php
$entity = $em->find('Application\Model\Entity\MyEntity', $id, \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE);
Také musíte použít příkaz uvnitř transakce, aby to fungovalo.