Mysql
 sql >> Database >  >> RDS >> Mysql

Doctrine2 ORM seleziona per l'aggiornamento

Apparentemente, Doctrine 2 utilizza LOCK IN SHARED MODE con il blocco di lettura pessimistico per MySQL, che non è lo stesso di SELECT FOR UPDATE.

Guardando i sorgenti dell'attuale versione stabile, sembra che non ci sia un modo nativo per farlo in Doctrine (non sono sicuro del motivo per cui il team di Doctrine ha scelto quel tipo di blocco per MySQL).

Ho usato SQL nativo come soluzione alternativa, che può essere mappata alle entità tradizionali, come sarebbe con 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();

Aggiorna

Come ha sottolineato Benjamin, PESSIMISTIC_WRITE è quello che stai cercando.

Con 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);

Senza DQL

<?php
$entity = $em->find('Application\Model\Entity\MyEntity', $id, \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE);

Inoltre, devi utilizzare l'istruzione all'interno di una transazione per farlo funzionare.