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

Doctrine2 ORM vælg til opdatering

Tilsyneladende bruger Doctrine 2 LÅS I DELT TILSTAND med pessimistisk læselås til MySQL, hvilket ikke er det samme som VÆLG TIL OPDATERING.

Ser man på kilderne til den aktuelle stabile udgivelse, ser det ud til, at der ikke er nogen indbygget måde at gøre det på i Doctrine (jeg er ikke sikker på, hvorfor Doctrine-teamet valgte den type lås til MySQL).

Jeg brugte native SQL som løsning, som kan kortlægges til de traditionelle entiteter, som det ville være med 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();

Opdater

Som Benjamin har påpeget, er PESSIMISTIC_WRITE, hvad du leder efter.

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

Uden DQL

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

Du skal også bruge erklæringen i en transaktion for at få den til at fungere.



  1. Hvordan skal jeg indeksere en forespørgsel med to intervalbetingelser?

  2. Gendan MySQL-databasemappe fra en gendannet harddisk

  3. MariaDB navngivne kommandoer

  4. Python Mysql, kommandoer ude af synkronisering; du kan ikke køre denne kommando nu