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') {
 | 
						|
            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',
 | 
						|
        ]);
 | 
						|
    }
 | 
						|
}
 |