---
title: "Unit of Work - узгоджені зміни"
url: https://laravelukraine.com/blog/unit-of-work-uzgodzeni-zmini
date: 2026-09-01
---

# Unit of Work - узгоджені зміни

Unit of Work групує кілька змін у єдину транзакцію, щоб вони застосувалися разом або не застосувалися зовсім.

### Яку проблему вирішує

Складна операція часто змінює кілька записів (списання, резерв, лог). Якщо частина збережеться, а на наступному кроці станеться помилка, дані лишаться у неузгодженому стані.

### Як вирішує

Усі зміни об'єднуються в одну транзакцію: при успіху - commit, при винятку - rollback усього разом. У Laravel цю роль виконує `DB::transaction()`: зміни всередині замикання застосовуються атомарно.

```php
DB::transaction(function () use ($order, $items) {
  $order->status = 'paid';
  $order->save();

  foreach ($items as $item) {
    $item->status = 'reserved';
    $item->save();
  }

  PaymentLog::create([
    'order_id' => $order->id,
    'amount' => $order->total,
  ]);
});
```

`DB::transaction()` автоматично робить commit при успіху і rollback при винятку, а ще вміє повторювати транзакцію при deadlock (другий аргумент - кількість спроб).

### Де застосовувати

- Складні доменні операції, де кілька записів мусять змінитися узгоджено.
- Скрізь, де часткове збереження лишить дані у невалідному стані.

### Плюси та мінуси

- **+** Гарантує узгодженість: усе або нічого.
- **+** Автоматичний rollback при винятку і повтор при deadlock.
- **−** Довгі транзакції тримають блокування й б'ють по продуктивності.
- **−** Для одиничного запису транзакція зайва - Eloquent і так атомарний на рівні одного `save()`.
