← Блокування одночасних викликів
docs: rewrite JsonRpcBundle docs, add SDK docs, move them under docs/api
uk/docs/api/json-rpc-bundle/add_rpc_service/lock.md
новий файл +50
−0
1
+
## Summary
2
+
3
+
| | |
4
+
| --- | --- |
5
+
| **Classname** | `Lock` |
6
+
| **Namespace** | `Ufo\RpcObject\RPC` |
7
+
| **Target** | method |
8
+
9
+
```php
10
+
public function __construct(
11
+
public ?string $paramName = null,
12
+
public ?int $ttl = null,
13
+
)
14
+
```
15
+
16
+
# Блокування одночасних викликів
17
+
18
+
Деякі методи не можна виконувати паралельно: оплата одного замовлення, генерація звіту, синхронізація з зовнішньою системою. Атрибут `#[RPC\Lock]` не дає запустити метод, поки попередній виклик ще виконується.
19
+
20
+
```php
21
+
use Ufo\RpcObject\RPC;
22
+
23
+
#[RPC\Lock(paramName: 'orderId', ttl: RPC\Lock::T_10_SECOND)]
24
+
public function pay(string $orderId): bool
25
+
{
26
+
// ...
27
+
}
28
+
```
29
+
30
+
* `paramName` — блокування окремо для кожного значення параметра: два виклики `pay` з різними `orderId` виконуються одночасно, з однаковим — ні. Без `paramName` метод блокується цілком, незалежно від аргументів.
31
+
* `ttl` — час життя блокування в секундах, щоб воно не лишилося назавжди, якщо процес впав. Константи: `T_SECOND`, `T_2_SECOND`, `T_5_SECOND`, `T_10_SECOND`, `T_20_SECOND`, `T_30_SECOND`.
32
+
33
+
Блокування захоплюється перед виконанням методу (подія `rpc.pre_execute`) і звільняється після нього, зокрема при помилці. Захоплення блокувальне (`acquire(true)`): паралельний виклик з тим самим ключем чекає, доки блокування звільниться. Якщо сховище блокувань повідомляє про конфлікт, виклик завершується помилкою:
34
+
35
+
```json
36
+
{
37
+
"jsonrpc": "2.0",
38
+
"id": 1,
39
+
"error": {
40
+
"code": -32400,
41
+
"message": "Method 'Order.pay' is locked."
42
+
}
43
+
}
44
+
```
45
+
46
+
:::warning subtitle="Відома нестиковка"
47
+
У поточній версії конфлікт не перетворюється на помилку: паралельний виклик чекає звільнення блокування. Деталі й обхідний шлях — у розділі [Актуальні помилки](/docs/api/json-rpc-bundle/developers/known_issues/open).
48
+
:::
49
+
50
+
Блокування реалізоване на [Symfony Lock](https://symfony.com/doc/current/components/lock.html); для нього потрібне розширення `ext-sysvsem`.