PHP code example of mpyw / laravel-database-advisory-lock
1. Go to this page and download the library: Download mpyw/laravel-database-advisory-lock library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
mpyw / laravel-database-advisory-lock example snippets
use Illuminate\Support\Facades\DB;
use Illuminate\Database\ConnectionInterface;
// Session-Level Locking
$result = DB::advisoryLocker()
->forSession()
->withLocking('<key>', function (ConnectionInterface $conn) {
// critical section here
return ...;
}); // no wait
$result = DB::advisoryLocker()
->forSession()
->withLocking('<key>', function (ConnectionInterface $conn) {
// critical section here
return ...;
}, timeout: 5); // wait for 5 seconds or fail
$result = DB::advisoryLocker()
->forSession()
->withLocking('<key>', function (ConnectionInterface $conn) {
// critical section here
return ...;
}, timeout: -1); // infinite wait (except MariaDB)
// Postgres only feature: Transaction-Level Locking (no wait)
$result = DB::transaction(function (ConnectionInterface $conn) {
$conn->advisoryLocker()->forTransaction()->lockOrFail('<key>');
// critical section here
return ...;
});
namespace App\Providers;
use App\Database\PostgresConnection;
use Illuminate\Database\Connection;
use Illuminate\Support\ServiceProvider;
class DatabaseServiceProvider extends ServiceProvider
{
public function register(): void
{
Connection::resolverFor('pgsql', function (...$parameters) {
return new PostgresConnection(...$parameters);
});
}
}
namespace App\Database;
use Illuminate\Database\PostgresConnection as BasePostgresConnection;
use Mpyw\LaravelDatabaseAdvisoryLock\AdvisoryLocks;
class PostgresConnection extends BasePostgresConnection
{
use AdvisoryLocks;
}
> if (DB::transactionLevel() > 1) {
> throw new LogicException("Don't use nested transactions outside of this logic.");
> }
>
> DB::advisoryLocker()
> ->forTransaction()
> ->lockOrFail('<key>');
> // critical section with transaction here
>
> if (DB::transactionLevel() > 0) {
> throw new LogicException("Don't use transactions outside of this logic.");
> }
>
> $result = DB::advisoryLocker()
> ->forSession()
> ->withLocking('<key>', fn (ConnectionInterface $conn) => $conn->transaction(function () {
> // critical section with transaction here
> }));
>
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.