sql >> Databáze >  >> RDS >> Mysql

Doctrine2 ORM vyberte pro aktualizaci

Doctrine 2 zjevně používá ZÁMEK VE SDÍLENÉM REŽIMU s pesimistickým zámkem čtení pro MySQL, což není totéž jako SELECT FOR UPDATE.

Při pohledu na zdroje aktuální stabilní verze se zdá, že v Doctrine neexistuje žádný nativní způsob, jak toho dosáhnout (nejsem si jistý, proč tým Doctrine zvolil tento typ zámku pro MySQL).

Jako řešení jsem použil nativní SQL, které lze namapovat na tradiční entity, jako by tomu bylo u 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();

Aktualizovat

Jak Benjamin zdůraznil, PESSIMISTIC_WRITE je to, co hledáte.

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

Bez DQL

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

Také musíte použít příkaz uvnitř transakce, aby to fungovalo.



  1. XAMPP MySQL - Nastavení ft_min_word_len

  2. Zkrácení serveru SQL Server a omezení 8192

  3. Použití GO v rámci transakce

  4. VYMAZAT OBRAZOVKU – zástupce Oracle SQL Developer?