@@ -165,6 +165,56 @@ This component also provides two useful methods related to expiring locks:
165
165
``getExpiringDate() `` (which returns ``null `` or a ``\DateTimeImmutable ``
166
166
object) and ``isExpired() `` (which returns a boolean).
167
167
168
+ Shared Locks
169
+ ------------
170
+
171
+ Sometimes, a data structure cannot be updated atomically and is invalid during
172
+ the time of the update. In this situation, other process should not read or
173
+ write the data until the update is complete. But once updated, multiple process
174
+ can read the data in parallel.
175
+
176
+ In this situation, a common solution is to use shared lock which allows
177
+ concurent access for read-only operations, while write operations require
178
+ exclusive access.
179
+
180
+ Use the :method: `Symfony\\ Component\\ Lock\\ LockInterface::acquireRead ` method
181
+ to acquire a read-only lock, and the existing
182
+ :method: `Symfony\\ Component\\ Lock\\ LockInterface::acquire ` method to acquire a
183
+ write lock.::
184
+
185
+ $lock = $factory->createLock('user'.$user->id);
186
+ if (!$lock->acquireRead()) {
187
+ return;
188
+ }
189
+
190
+ Similare to the ``acquire `` method, pass ``true `` as the argument of the ``acquireRead() ``
191
+ method to acquire the lock in a blocking mode.::
192
+
193
+ $lock = $factory->createLock('user'.$user->id);
194
+ $lock->acquireRead(true);
195
+
196
+ When a read-only lock is acquired with the method ``acquireRead ``, it's
197
+ possible to **Promote ** the lock, and change it to write lock, by calling the
198
+ ``acquire `` method.::
199
+
200
+ $lock = $factory->createLock('user'.$userId);
201
+ $lock->acquireRead(true);
202
+
203
+ if (!$this->shouldUpdate($userId)) {
204
+ return;
205
+ }
206
+
207
+ $lock->acquire(true); // Promote the lock to write lock
208
+ $this->update($userId);
209
+
210
+ In the same way, it's possible to **Demote ** a write lock, and change it to a
211
+ read-only lock by calling the ``acquireRead `` method.
212
+
213
+ .. versionadded :: 5.2
214
+
215
+ The ``Lock::acquireRead `` method and ``SharedLockStoreInterface `` interface
216
+ and were introduced in Symfony 5.2.
217
+
168
218
The Owner of The Lock
169
219
---------------------
170
220
@@ -219,17 +269,17 @@ Locks are created and managed in ``Stores``, which are classes that implement
219
269
220
270
The component includes the following built-in store types:
221
271
222
- ============================================ ====== ======== ========
223
- Store Scope Blocking Expiring
224
- ============================================ ====== ======== ========
225
- :ref: `FlockStore <lock-store-flock >` local yes no
226
- :ref: `MemcachedStore <lock-store-memcached >` remote no yes
227
- :ref: `MongoDbStore <lock-store-mongodb >` remote no yes
228
- :ref: `PdoStore <lock-store-pdo >` remote no yes
229
- :ref: `RedisStore <lock-store-redis >` remote no yes
230
- :ref: `SemaphoreStore <lock-store-semaphore >` local yes no
231
- :ref: `ZookeeperStore <lock-store-zookeeper >` remote no no
232
- ============================================ ====== ======== ========
272
+ ============================================ ====== ======== ======== =======
273
+ Store Scope Blocking Expiring Sharing
274
+ ============================================ ====== ======== ======== =======
275
+ :ref: `FlockStore <lock-store-flock >` local yes no yes
276
+ :ref: `MemcachedStore <lock-store-memcached >` remote no yes no
277
+ :ref: `MongoDbStore <lock-store-mongodb >` remote no yes no
278
+ :ref: `PdoStore <lock-store-pdo >` remote no yes no
279
+ :ref: `RedisStore <lock-store-redis >` remote no yes yes
280
+ :ref: `SemaphoreStore <lock-store-semaphore >` local yes no no
281
+ :ref: `ZookeeperStore <lock-store-zookeeper >` remote no no no
282
+ ============================================ ====== ======== ======== =======
233
283
234
284
.. _lock-store-flock :
235
285
0 commit comments