Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Doctrine2 ORM zur Aktualisierung auswählen

Anscheinend verwendet Doctrine 2 LOCK IN SHARED MODE mit pessimistischer Lesesperre für MySQL, was nicht dasselbe ist wie SELECT FOR UPDATE.

Wenn man sich die Quellen der aktuellen stabilen Version ansieht, scheint es, dass es in Doctrine keine native Möglichkeit gibt, dies zu tun (ich bin mir nicht sicher, warum das Doctrine-Team diese Art von Sperre für MySQL gewählt hat).

Als Problemumgehung habe ich natives SQL verwendet, das den traditionellen Entitäten zugeordnet werden kann, wie es bei DQL der Fall wäre:

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

Aktualisieren

Wie Benjamin betont hat, ist PESSIMISTIC_WRITE genau das, wonach Sie suchen.

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

Ohne DQL

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

Außerdem müssen Sie die Anweisung innerhalb einer Transaktion verwenden, damit sie funktioniert.