Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment réessayer une transaction après un blocage en utilisant Doctrine ?

Un interblocage renvoie l'erreur 1213 que vous devez traiter côté client

Notez qu'un interblocage et une attente de verrouillage sont des choses différentes. Dans une impasse, il n'y a pas de transaction « ratée » :ils sont tous les deux coupables. Il n'y a aucune garantie de savoir lequel sera annulé.

Vous devez utiliser rollback , votre code de style insérera un doublon. par exemple vous devriez :

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

    }

}

J'espère que cette aide.