2020final class PostgresAdvisoryLocker
2121{
2222 /**
23- * Acquire an advisory lock with configurable scope and mode .
23+ * Acquire an advisory lock with configurable scope, mode and behavior .
2424 */
2525 public function acquireLock (
2626 PDO $ dbConnection ,
2727 PostgresLockId $ postgresLockId ,
2828 PostgresAdvisoryLockScopeEnum $ scope = PostgresAdvisoryLockScopeEnum::Transaction,
29- PostgresAdvisoryLockModeEnum $ mode = PostgresAdvisoryLockModeEnum::Try,
29+ PostgresAdvisoryLockTypeEnum $ type = PostgresAdvisoryLockTypeEnum::NonBlocking,
30+ PostgresLockModeEnum $ mode = PostgresLockModeEnum::Exclusive,
3031 ): bool {
3132 if ($ scope === PostgresAdvisoryLockScopeEnum::Transaction && $ dbConnection ->inTransaction () === false ) {
3233 throw new LogicException (
3334 "Transaction-level advisory lock ` $ postgresLockId ->humanReadableValue ` cannot be acquired outside of transaction " ,
3435 );
3536 }
3637
37- $ sql = match ([$ scope , $ mode ]) {
38- [PostgresAdvisoryLockScopeEnum::Transaction, PostgresAdvisoryLockModeEnum::Try] =>
39- 'SELECT PG_TRY_ADVISORY_XACT_LOCK(:class_id, :object_id); -- ' . $ postgresLockId ->humanReadableValue ,
40- [PostgresAdvisoryLockScopeEnum::Transaction, PostgresAdvisoryLockModeEnum::Block] =>
41- 'SELECT PG_ADVISORY_XACT_LOCK(:class_id, :object_id); -- ' . $ postgresLockId ->humanReadableValue ,
42- [PostgresAdvisoryLockScopeEnum::Session, PostgresAdvisoryLockModeEnum::Try] =>
43- 'SELECT PG_TRY_ADVISORY_LOCK(:class_id, :object_id); -- ' . $ postgresLockId ->humanReadableValue ,
44- [PostgresAdvisoryLockScopeEnum::Session, PostgresAdvisoryLockModeEnum::Block] =>
45- 'SELECT PG_ADVISORY_LOCK(:class_id, :object_id); -- ' . $ postgresLockId ->humanReadableValue ,
38+ $ sql = match ([$ scope , $ type , $ mode ]) {
39+ [
40+ PostgresAdvisoryLockScopeEnum::Transaction,
41+ PostgresAdvisoryLockTypeEnum::NonBlocking,
42+ PostgresLockModeEnum::Exclusive,
43+ ] => 'SELECT PG_TRY_ADVISORY_XACT_LOCK(:class_id, :object_id); ' ,
44+ [
45+ PostgresAdvisoryLockScopeEnum::Transaction,
46+ PostgresAdvisoryLockTypeEnum::Blocking,
47+ PostgresLockModeEnum::Exclusive,
48+ ] => 'SELECT PG_ADVISORY_XACT_LOCK(:class_id, :object_id); ' ,
49+ [
50+ PostgresAdvisoryLockScopeEnum::Transaction,
51+ PostgresAdvisoryLockTypeEnum::NonBlocking,
52+ PostgresLockModeEnum::Share,
53+ ] => 'SELECT PG_TRY_ADVISORY_XACT_LOCK_SHARE(:class_id, :object_id); ' ,
54+ [
55+ PostgresAdvisoryLockScopeEnum::Transaction,
56+ PostgresAdvisoryLockTypeEnum::Blocking,
57+ PostgresLockModeEnum::Share,
58+ ] => 'SELECT PG_ADVISORY_XACT_LOCK_SHARE(:class_id, :object_id); ' ,
59+ [
60+ PostgresAdvisoryLockScopeEnum::Session,
61+ PostgresAdvisoryLockTypeEnum::NonBlocking,
62+ PostgresLockModeEnum::Exclusive,
63+ ] => 'SELECT PG_TRY_ADVISORY_LOCK(:class_id, :object_id); ' ,
64+ [
65+ PostgresAdvisoryLockScopeEnum::Session,
66+ PostgresAdvisoryLockTypeEnum::Blocking,
67+ PostgresLockModeEnum::Exclusive,
68+ ] => 'SELECT PG_ADVISORY_LOCK(:class_id, :object_id); ' ,
69+ [
70+ PostgresAdvisoryLockScopeEnum::Session,
71+ PostgresAdvisoryLockTypeEnum::NonBlocking,
72+ PostgresLockModeEnum::Share,
73+ ] => 'SELECT PG_TRY_ADVISORY_LOCK_SHARE(:class_id, :object_id); ' ,
74+ [
75+ PostgresAdvisoryLockScopeEnum::Session,
76+ PostgresAdvisoryLockTypeEnum::Blocking,
77+ PostgresLockModeEnum::Share,
78+ ] => 'SELECT PG_ADVISORY_LOCK_SHARE(:class_id, :object_id); ' ,
4679 };
80+ $ sql .= " -- $ postgresLockId ->humanReadableValue " ;
4781
4882 $ statement = $ dbConnection ->prepare ($ sql );
4983 $ statement ->execute (
@@ -57,7 +91,7 @@ public function acquireLock(
5791 }
5892
5993 /**
60- * Release session- level lock.
94+ * Release session level advisory lock.
6195 */
6296 public function releaseLock (
6397 PDO $ dbConnection ,
@@ -84,7 +118,7 @@ public function releaseLock(
84118 }
85119
86120 /**
87- * Release all session- level locks.
121+ * Release all session level advisory locks held by the current session .
88122 */
89123 public function releaseAllLocks (
90124 PDO $ dbConnection ,
0 commit comments