Ternyata, Doctrine 2 menggunakan LOCK IN SHARED MODE dengan Pessimistic read lock untuk MySQL, yang tidak sama dengan SELECT FOR UPDATE.
Melihat sumber rilis stabil saat ini, tampaknya tidak ada cara asli untuk melakukannya di Doctrine (saya tidak yakin mengapa tim Doctrine memilih jenis kunci itu untuk MySQL).
Saya menggunakan SQL asli sebagai solusi, yang dapat dipetakan ke entitas tradisional, seperti halnya dengan 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();
Perbarui
Seperti yang telah ditunjukkan Benjamin, PESSIMISTIC_WRITE adalah yang Anda cari.
Dengan 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);
Tanpa DQL
<?php
$entity = $em->find('Application\Model\Entity\MyEntity', $id, \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE);
Selain itu, Anda harus menggunakan pernyataan di dalam transaksi untuk membuatnya berfungsi.