master

laravel/framework

Last updated at: 29/12/2023 09:21

DetectsConcurrencyErrors.php

TLDR

This file contains the trait DetectsConcurrencyErrors, which provides a method to determine if a given exception was caused by a concurrency error such as a deadlock or serialization failure.

Methods

causedByConcurrencyError

This method takes a Throwable object as a parameter and returns a boolean value indicating whether the given exception was caused by a concurrency error. It checks if the exception is an instance of PDOException and if its error code is 40001 or '40001'. It also checks the exception message for specific strings indicating concurrency errors.

END

<?php

namespace Illuminate\Database;

use Illuminate\Support\Str;
use PDOException;
use Throwable;

trait DetectsConcurrencyErrors
{
    /**
     * Determine if the given exception was caused by a concurrency error such as a deadlock or serialization failure.
     *
     * @param  \Throwable  $e
     * @return bool
     */
    protected function causedByConcurrencyError(Throwable $e)
    {
        if ($e instanceof PDOException && ($e->getCode() === 40001 || $e->getCode() === '40001')) {
            return true;
        }

        $message = $e->getMessage();

        return Str::contains($message, [
            'Deadlock found when trying to get lock',
            'deadlock detected',
            'The database file is locked',
            'database is locked',
            'database table is locked',
            'A table in the database is locked',
            'has been chosen as the deadlock victim',
            'Lock wait timeout exceeded; try restarting transaction',
            'WSREP detected deadlock/conflict and aborted the transaction. Try restarting the transaction',
        ]);
    }
}