sql >> Base de Datos >  >> RDS >> Mysql

Doctrine2 ORM seleccionado para actualizar

Aparentemente, Doctrine 2 usa BLOQUEO EN MODO COMPARTIDO con bloqueo de lectura pesimista para MySQL, que no es lo mismo que SELECCIONAR PARA ACTUALIZAR.

Mirando las fuentes de la versión estable actual, parece que no hay una forma nativa de hacerlo en Doctrine (no estoy seguro de por qué el equipo de Doctrine eligió ese tipo de bloqueo para MySQL).

Usé SQL nativo como solución alternativa, que se puede asignar a las entidades tradicionales, como sería 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();

Actualizar

Como ha señalado Benjamin, PESSIMISTIC_WRITE es lo que está buscando.

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

Sin DQL

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

Además, debe usar la declaración dentro de una transacción para que funcione.