Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Doctrine2 ORM pilih untuk pembaruan

Ternyata, Doctrine 2 menggunakan LOCK IN SHARED MODE dengan Pessimistic read lock untuk MySQL, yang tidak sama dengan SELECT FOR UPDATE.

Melihat sumber rilis stabil saat ini, tampaknya tidak ada cara asli untuk melakukannya di Doctrine (saya tidak yakin mengapa tim Doctrine memilih jenis kunci itu untuk MySQL).

Saya menggunakan SQL asli sebagai solusi, yang dapat dipetakan ke entitas tradisional, seperti halnya dengan 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();

Perbarui

Seperti yang telah ditunjukkan Benjamin, PESSIMISTIC_WRITE adalah yang Anda cari.

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

Tanpa DQL

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

Selain itu, Anda harus menggunakan pernyataan di dalam transaksi untuk membuatnya berfungsi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql group_concat tidak membawa seluruh data

  2. Bagaimana cara membuat file CSV dari database dengan Python?

  3. while($row =mysql_fetch_assoc($result)) - Bagaimana cara melakukan $row?

  4. Perl DBI fetchall_hashref

  5. Apakah Python mendukung pernyataan yang disiapkan MySQL?