Skip to content

Commit 6660f2d

Browse files
committed
Documented Lock::isAcquired() method
1 parent 90797c3 commit 6660f2d

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed

components/lock.rst

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,51 @@ This component also provides two useful methods related to expiring locks:
150150
``getExpiringDate()`` (which returns ``null`` or a ``\DateTimeImmutable``
151151
object) and ``isExpired()`` (which returns a boolean).
152152

153+
The Owner of The Lock
154+
---------------------
155+
156+
Locks that are acquired for the first time are owned[1]_ by the ``Lock`` instance that acquired
157+
it. If you need to check whether the current ``Lock`` instance is (still) the owner of
158+
a lock, you can use the ``isAcquired()`` method::
159+
160+
if ($lock->isAcquired()) {
161+
// We (still) own the lock
162+
}
163+
164+
Because of the fact that some lock stores have expiring locks (as seen and explained
165+
above), it is possible for an instance to lose the lock it acquired automatically::
166+
167+
// If we cannot acquire ourselves, it means some other process is already working on it
168+
if (!$lock->acquire()) {
169+
return;
170+
}
171+
172+
$this->beginTransaction();
173+
174+
// Perform a very long process that might exceed TTL of the lock
175+
176+
if ($lock->isAcquired()) {
177+
// Still all good, no other instance has acquired the lock in the meantime, we're safe
178+
$this->commit();
179+
} else {
180+
// Bummer! Our lock has apparently exceeded TTL and another process has started in
181+
// the meantime so it's not safe for us to commit.
182+
$this->rollback();
183+
throw new \Exception('Process failed');
184+
}
185+
186+
.. caution::
187+
188+
A common pitfall might be to use the ``isAcquired()`` method to check if
189+
a lock has already been acquired by any process. As you can see in this example
190+
you have to use ``acquire()`` for this. The ``isAcquired()`` method is used to check
191+
if the lock has been acquired by the **current process** only!
192+
193+
.. [1] Technically, the true owners of the lock are the ones that share the same instance of ``Key``,
194+
not ``Lock``. But from a user perspective, ``Key`` is internal and you will likely only be working
195+
with the ``Lock`` instance so it's easier to think of the ``Lock`` instance as being the one that
196+
is the owner of the lock.
197+
153198
Available Stores
154199
----------------
155200

0 commit comments

Comments
 (0)