sql >> Database teknologi >  >> RDS >> Mysql

Hvordan prøver man en transaktion igen efter et dødvande ved hjælp af Doctrine?

En deadlock returnerer fejl 1213, som du skal behandle på klientsiden

Bemærk, at en deadlock og låsevent er forskellige ting. I et dødvande er der ingen "mislykket" transaktion:de er begge skyldige. Der er ingen garanti for, hvilken der vil blive rullet tilbage.

Du skal bruge rollback , vil din stilkode indsætte duplikat. for eksempel skal du :

$retry = 0;

$done = false;


$this->entityManager->getConnection()->beginTransaction(); // suspend auto-commit

while (!$done and $retry < 3) {

    try {

        $this->entityManager->flush();

        $this->entityManager->getConnection()->commit(); // commit if succesfull

        $done = true;

    } catch (\Exception $e) {

        $this->entityManager->getConnection()->rollback(); // transaction marked for rollback only

        $retry++;

    }

}

Håber dette hjælper.



  1. Forhindrer Knex.js sql-injektion?

  2. Optagelsesbaseret indsættelse og opdatering i Oracle

  3. Brug af JShell i Java 9 i NetBeans 9.0, del 2

  4. Valg af lagermotor:Aria