38 lines
1.1 KiB
PHP
38 lines
1.1 KiB
PHP
<?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',
|
|
]);
|
|
}
|
|
}
|