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

Come riprovare la transazione dopo un deadlock utilizzando Doctrine?

Un deadlock restituisce l'errore 1213 che dovresti elaborare sul lato client

Si noti che un deadlock e un'attesa di blocco sono cose diverse. In una situazione di stallo, non c'è transazione "fallita":entrambi sono colpevoli. Non vi è alcuna garanzia di quale verrà annullato.

Devi utilizzare rollback , il tuo codice di stile inserirà un duplicato. per esempio dovresti:

$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++;

    }

}

Spero che questo aiuti.