sql >> データベース >  >> RDS >> Mysql

Doctrine2ORMが更新を選択

    どうやら、Doctrine2はMySQLのPessimisticreadlockでLOCKIN SHARED MODEを使用していますが、これはSELECTFORUPDATEと同じではありません。

    現在の安定版リリースのソースを見ると、Doctrineにはネイティブな方法がないようです(DoctrineチームがMySQLにそのタイプのロックを選択した理由はわかりません)。

    回避策としてネイティブSQLを使用しました。これは、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();
    

    更新

    ベンジャミンが指摘しているように、PESSIMISTIC_WRITEはあなたが探しているものです。

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

    DQLなし

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

    また、トランザクションを機能させるには、トランザクション内でステートメントを使用する必要があります。



    1. mysqliまたはPDO-長所と短所は何ですか?

    2. SQLServerで複数のスペースの文字列を返す3つの方法

    3. Codeigniterのforeach()に無効な引数が指定されました

    4. SQLSTATE[HY000][2002]そのようなファイルまたはディレクトリはありません