Rõ ràng, Doctrine 2 sử dụng LOCK IN SHARED MODE với khóa đọc Pessimistic cho MySQL, không giống như SELECT FOR UPDATE.
Nhìn vào các nguồn của bản phát hành ổn định hiện tại, có vẻ như không có cách nào nguyên bản để làm như vậy trong Doctrine (tôi không rõ tại sao nhóm Doctrine lại chọn loại khóa đó cho MySQL).
Tôi đã sử dụng SQL gốc làm giải pháp thay thế, có thể được ánh xạ tới các thực thể truyền thống, giống như với 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();
Cập nhật
Như Benjamin đã chỉ ra, PESSIMISTIC_WRITE là thứ bạn đang tìm kiếm.
Với 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);
Không có DQL
<?php
$entity = $em->find('Application\Model\Entity\MyEntity', $id, \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE);
Ngoài ra, bạn phải sử dụng câu lệnh bên trong một giao dịch để làm cho nó hoạt động.