Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como repetir a transação após um deadlock usando o Doctrine?


Um impasse retorna o erro 1213 que você deve processar no lado do cliente

Observe que um impasse e uma espera de bloqueio são coisas diferentes. Em um impasse, não há transação "falhou":ambos são culpados. Não há garantia de qual deles será revertido.

Você deve usar rollback , seu código de estilo inserirá duplicata. por exemplo, você deve:
$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 ajuda.