sql >> Databasteknik >  >> RDS >> Mysql

Doctrine2 ORM välj för uppdatering

Tydligen använder Doctrine 2 LÅS I DELAT LÄGE med pessimistiskt läslås för MySQL, vilket inte är samma sak som VÄLJ FÖR UPPDATERING.

Om man tittar på källorna till den nuvarande stabila utgåvan verkar det som om det inte finns något naturligt sätt att göra det i Doctrine (jag är inte säker på varför Doctrine-teamet valde den typen av lås för MySQL).

Jag använde inbyggd SQL som lösning, som kan mappas till de traditionella enheterna, som det skulle vara 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();

Uppdatera

Som Benjamin har påpekat är PESSIMISTIC_WRITE vad du letar 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);

Utan DQL

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

Du måste också använda uttalandet i en transaktion för att få det att fungera.



  1. Hur man frågar en CLOB-kolumn i Oracle

  2. Vilket är det bästa PostgreSQL-gränssnittet? Jämförelse 2021

  3. ADO.NET anropar T-SQL lagrad procedur orsakar ett SqlTimeoutException

  4. php / Mysql bästa trädstruktur