Skip to content

Commit 33aa8a1

Browse files
committed
Fix shared locks
1 parent 58a42a9 commit 33aa8a1

File tree

2 files changed

+16
-13
lines changed

2 files changed

+16
-13
lines changed

src/Locker/PostgresAdvisoryLockTypeEnum.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@
99
*
1010
* - NonBlocking. Attempt to acquire the lock without blocking:
1111
* - PG_TRY_ADVISORY_LOCK
12-
* - PG_TRY_ADVISORY_LOCK_SHARE
12+
* - PG_TRY_ADVISORY_LOCK_SHARED
1313
* - PG_TRY_ADVISORY_XACT_LOCK
14-
* - PG_TRY_ADVISORY_XACT_LOCK_SHARE
14+
* - PG_TRY_ADVISORY_XACT_LOCK_SHARED
1515
* - Blocking. Acquire the lock, blocking until it becomes available:
1616
* - PG_ADVISORY_LOCK
17-
* - PG_ADVISORY_LOCK_SHARE
17+
* - PG_ADVISORY_LOCK_SHARED
1818
* - PG_ADVISORY_XACT_LOCK
19-
* - PG_ADVISORY_XACT_LOCK_SHARE
19+
* - PG_ADVISORY_XACT_LOCK_SHARED
2020
*/
2121
enum PostgresAdvisoryLockTypeEnum
2222
{

src/Locker/PostgresAdvisoryLocker.php

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,12 @@ public function acquireLock(
5050
PostgresAdvisoryLockScopeEnum::Transaction,
5151
PostgresAdvisoryLockTypeEnum::NonBlocking,
5252
PostgresLockModeEnum::Share,
53-
] => 'SELECT PG_TRY_ADVISORY_XACT_LOCK_SHARE(:class_id, :object_id);',
53+
] => 'SELECT PG_TRY_ADVISORY_XACT_LOCK_SHARED(:class_id, :object_id);',
5454
[
5555
PostgresAdvisoryLockScopeEnum::Transaction,
5656
PostgresAdvisoryLockTypeEnum::Blocking,
5757
PostgresLockModeEnum::Share,
58-
] => 'SELECT PG_ADVISORY_XACT_LOCK_SHARE(:class_id, :object_id);',
58+
] => 'SELECT PG_ADVISORY_XACT_LOCK_SHARED(:class_id, :object_id);',
5959
[
6060
PostgresAdvisoryLockScopeEnum::Session,
6161
PostgresAdvisoryLockTypeEnum::NonBlocking,
@@ -70,12 +70,12 @@ public function acquireLock(
7070
PostgresAdvisoryLockScopeEnum::Session,
7171
PostgresAdvisoryLockTypeEnum::NonBlocking,
7272
PostgresLockModeEnum::Share,
73-
] => 'SELECT PG_TRY_ADVISORY_LOCK_SHARE(:class_id, :object_id);',
73+
] => 'SELECT PG_TRY_ADVISORY_LOCK_SHARED(:class_id, :object_id);',
7474
[
7575
PostgresAdvisoryLockScopeEnum::Session,
7676
PostgresAdvisoryLockTypeEnum::Blocking,
7777
PostgresLockModeEnum::Share,
78-
] => 'SELECT PG_ADVISORY_LOCK_SHARE(:class_id, :object_id);',
78+
] => 'SELECT PG_ADVISORY_LOCK_SHARED(:class_id, :object_id);',
7979
};
8080
$sql .= " -- $postgresLockId->humanReadableValue";
8181

@@ -97,16 +97,19 @@ public function releaseLock(
9797
PDO $dbConnection,
9898
PostgresLockId $postgresLockId,
9999
PostgresAdvisoryLockScopeEnum $scope = PostgresAdvisoryLockScopeEnum::Session,
100+
PostgresLockModeEnum $mode = PostgresLockModeEnum::Exclusive,
100101
): bool {
101102
if ($scope === PostgresAdvisoryLockScopeEnum::Transaction) {
102103
throw new \InvalidArgumentException('Transaction-level advisory lock cannot be released');
103104
}
104105

105-
$statement = $dbConnection->prepare(
106-
<<<SQL
107-
SELECT PG_ADVISORY_UNLOCK(:class_id, :object_id); -- $postgresLockId->humanReadableValue
108-
SQL,
109-
);
106+
$sql = match ($mode) {
107+
PostgresLockModeEnum::Exclusive => 'SELECT PG_ADVISORY_UNLOCK(:class_id, :object_id);',
108+
PostgresLockModeEnum::Share => 'SELECT PG_ADVISORY_UNLOCK_SHARED(:class_id, :object_id);',
109+
};
110+
$sql .= " -- $postgresLockId->humanReadableValue";
111+
112+
$statement = $dbConnection->prepare($sql);
110113
$statement->execute(
111114
[
112115
'class_id' => $postgresLockId->classId,

0 commit comments

Comments
 (0)