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.