Najwyraźniej Doctrine 2 używa BLOKADA W TRYBIE WSPÓŁDZIELONYM z pesymistyczną blokadą odczytu dla MySQL, co nie jest tym samym, co WYBIERZ DO AKTUALIZACJI.
Patrząc na źródła aktualnego wydania stabilnego, wydaje się, że nie ma natywnego sposobu na zrobienie tego w Doctrine (nie jestem pewien, dlaczego zespół Doctrine wybrał ten typ blokady dla MySQL).
Użyłem natywnego SQL jako obejście, które można zmapować na tradycyjne encje, tak jak w przypadku 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();
Aktualizacja
Jak zauważył Benjamin, PESSIMISTIC_WRITE jest tym, czego szukasz.
Z 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);
Ponadto, aby to zadziałało, musisz użyć instrukcji wewnątrz transakcji.