sql >> Database >  >> RDS >> Mysql

Doctrine2 ORM selecteren voor update

Blijkbaar gebruikt Doctrine 2 LOCK IN SHARED MODE met Pessimistic read lock voor MySQL, wat niet hetzelfde is als SELECT FOR UPDATE.

Kijkend naar de bronnen van de huidige stabiele release, lijkt het erop dat er geen native manier is om dit te doen in Doctrine (ik weet niet zeker waarom het Doctrine-team dat type slot voor MySQL heeft gekozen).

Ik gebruikte native SQL als tijdelijke oplossing, die kan worden toegewezen aan de traditionele entiteiten, zoals het zou zijn met 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();

Bijwerken

Zoals Benjamin heeft opgemerkt, is PESSIMISTIC_WRITE wat u zoekt.

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

Zonder DQL

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

U moet ook het afschrift in een transactie gebruiken om het te laten werken.



  1. Mysql insluiten in Java-desktoptoepassing

  2. Waarom krijg ik System.Data.DataRowView in plaats van echte waarden in mijn Listbox?

  3. Bulk_update_mappings gebruiken in SQLAlchemy om meerdere rijen met verschillende waarden bij te werken

  4. PostgreSQL-jokerteken LIKE voor een lijst met woorden