Unit of Work — паттерн из PoEAA (Fowler, 2002).

Задачи:

  1. Отследить, какие объекты изменились.
  2. Скоординировать запись в одной транзакции.
  3. Обеспечить консистентность.

Практика в Python: SQLAlchemy AsyncSession = Unit of Work. Дополнительный слой UoW редко нужен.

Ключевое правило: UoW живёт в use case, не в repository. Так одна бизнес-операция может изменить несколько aggregate в одной транзакции.

async def execute(self, cmd):
    async with self._uow:
        order = Order.place(cmd)
        await self._orders.save(order)
        await self._inventory.reserve(order)
        # commit по выходу из async with

Плохо: session.begin() внутри OrderRepository.save(). Тогда orders.save + inventory.reserve не могут быть в одной транзакции.

Синонимы

UoWЕдиница работы

Не путать с

← ко всему глоссарию