Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Seleção do ORM do Doctrine2 para atualização


Aparentemente, o Doctrine 2 usa LOCK IN SHARED MODE com Pessimistic read lock para MySQL, que não é o mesmo que SELECT FOR UPDATE.

Olhando para as fontes da versão estável atual, parece que não há uma maneira nativa de fazer isso no Doctrine (não sei por que a equipe do Doctrine escolheu esse tipo de bloqueio para o MySQL).

Usei o SQL nativo como solução alternativa, que pode ser mapeada para as entidades tradicionais, como seria com o 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();

Atualizar


Como Benjamin apontou, PESSIMISTIC_WRITE é o que você está procurando.

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

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

Além disso, você precisa usar a instrução dentro de uma transação para fazê-la funcionar.