どうやら、Doctrine2はMySQLのPessimisticreadlockでLOCKIN SHARED MODEを使用していますが、これはSELECTFORUPDATEと同じではありません。
現在の安定版リリースのソースを見ると、Doctrineにはネイティブな方法がないようです(DoctrineチームがMySQLにそのタイプのロックを選択した理由はわかりません)。
回避策としてネイティブSQLを使用しました。これは、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();
更新
ベンジャミンが指摘しているように、PESSIMISTIC_WRITEはあなたが探しているものです。
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);
DQLなし
<?php
$entity = $em->find('Application\Model\Entity\MyEntity', $id, \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE);
また、トランザクションを機能させるには、トランザクション内でステートメントを使用する必要があります。