sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo reintentar la transacción después de un punto muerto usando Doctrine?

Un interbloqueo devuelve el error 1213 que debe procesar en el lado del cliente

Tenga en cuenta que un interbloqueo y una espera de bloqueo son cosas diferentes. En un interbloqueo, no hay transacción "fallida":ambos son culpables. No hay garantía de cuál se revertirá.

Debe usar rollback , su código de estilo se insertará duplicado. por ejemplo, deberías:

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

    }

}

Espero que esta ayuda.