⭐ Found this useful? Install from Packagist and give it a star on GitHub.
Symfony bundle that retries EntityManager::flush() and custom operations when Doctrine DBAL raises a deadlock (SQLSTATE[40001], MySQL error 1213).
- DeadlockRetryService:
flush(?string $profile)andretry(callable $operation, ?string $profile). - Named profiles: configure
max_retries,sleep_ms, androllback_on_deadlockper use case. - Default profile: used when no profile name is passed.
- Detects
DeadlockExceptionand related driver errors in the exception chain.
- Installation
- Configuration
- Usage
- Contributing
- Changelog
- Upgrading
- Release
- Security
- Engram
- Spec-driven development
- Demo (Symfony 7 & 8) — run
make -C demo up-symfony8from the bundle root. - Demo with FrankenPHP (development and production) — includes FrankenPHP worker mode for production demos.
use Nowo\DoctrineDeadlockRetryBundle\Service\DeadlockRetryService;
public function __construct(
private readonly DeadlockRetryService $deadlockRetry,
) {
}
public function save(Order $order): void
{
$this->entityManager->persist($order);
$this->deadlockRetry->flush();
$this->deadlockRetry->flush('batch');
}- PHP >= 8.2, < 8.6 (Symfony 8.x requires PHP 8.4+)
- Symfony 6.0+ | 7.4+ | 8.0+ | 8.1+ (minimum tested minors: 7.4, 8.0, 8.1)
- Doctrine ORM and DoctrineBundle
- Tests: PHPUnit (PHP)
- PHP: 100%
The Composer package is nowo-tech/doctrine-deadlock-retry-bundle. Source and issues: nowo-tech/DoctrineDeadlockRetryBundle.
We follow Semantic Versioning. See Changelog. Security support is described in the Security policy.
MIT. See LICENSE.